Add a testbit() operationg.

This commit is contained in:
2018-12-23 21:05:27 -08:00
parent 85165c7f68
commit 70a082363a
62 changed files with 429542 additions and 311395 deletions

View File

@@ -87,6 +87,10 @@ macro_rules! signed_impls {
fn mask(&mut self, len: usize) { fn mask(&mut self, len: usize) {
self.value.mask(len); self.value.mask(len);
} }
fn testbit(&self, bit: usize) -> bool {
self.value.testbit(bit)
}
} }
#[cfg(test)] #[cfg(test)]

View File

@@ -13,6 +13,9 @@ pub trait CryptoNum {
/// Mask off the high parts of the number. In particular, it /// Mask off the high parts of the number. In particular, it
/// zeros the bits above (len * 64). /// zeros the bits above (len * 64).
fn mask(&mut self, len: usize); fn mask(&mut self, len: usize);
/// Test if the given bit is zero, where bits are numbered in
/// least-significant order (0 is the LSB, etc.).
fn testbit(&self, bit: usize) -> bool;
} }
macro_rules! generate_base macro_rules! generate_base
@@ -50,6 +53,17 @@ macro_rules! generate_base
self.value[i] = 0; self.value[i] = 0;
} }
} }
fn testbit(&self, bit: usize) -> bool {
let idx = bit / 64;
let offset = bit % 64;
println!("Testing bit {} of {:X}", bit, self);
if idx >= $size {
return false;
}
println!("{:x} & {:x} == {:x}", self.value[idx], 1u64 << offset, self.value[idx] & (1u64 << offset));
(self.value[idx] & (1u64 << offset)) != 0
}
} }
#[cfg(test)] #[cfg(test)]
@@ -93,23 +107,31 @@ macro_rules! generate_base_tests
}; };
(body $name: ident, $lname: ident) => { (body $name: ident, $lname: ident) => {
let fname = build_test_path("base", stringify!($name)); let fname = build_test_path("base", stringify!($name));
run_test(fname.to_string(), 6, |case| { run_test(fname.to_string(), 8, |case| {
let (neg0, xbytes) = case.get("x").unwrap(); let (neg0, xbytes) = case.get("x").unwrap();
let (neg1, mbytes) = case.get("m").unwrap(); let (neg1, mbytes) = case.get("m").unwrap();
let (neg2, zbytes) = case.get("z").unwrap(); let (neg2, zbytes) = case.get("z").unwrap();
let (neg3, ebytes) = case.get("e").unwrap(); let (neg3, ebytes) = case.get("e").unwrap();
let (neg4, obytes) = case.get("o").unwrap(); let (neg4, obytes) = case.get("o").unwrap();
let (neg5, rbytes) = case.get("r").unwrap(); let (neg5, rbytes) = case.get("r").unwrap();
assert!(!neg0 && !neg1 && !neg2 && !neg3 && !neg4 && !neg5); let (neg6, bbytes) = case.get("b").unwrap();
let (neg7, tbytes) = case.get("t").unwrap();
assert!(!neg0&&!neg1&&!neg2&&!neg3&&!neg4&&!neg5&&!neg6&&!neg7);
let mut x = $name::from_bytes(xbytes); let mut x = $name::from_bytes(xbytes);
println!("---------");
println!("x: {:x}", x);
let m = $name::from_bytes(mbytes); let m = $name::from_bytes(mbytes);
let z = 1 == zbytes[0]; let z = 1 == zbytes[0];
let e = 1 == ebytes[0]; let e = 1 == ebytes[0];
let o = 1 == obytes[0]; let o = 1 == obytes[0];
let r = $name::from_bytes(rbytes); let r = $name::from_bytes(rbytes);
let b = usize::from($name::from_bytes(bbytes));
println!("b: {:x}", b);
let t = 1 == tbytes[0];
assert_eq!(x.is_zero(), z); assert_eq!(x.is_zero(), z);
assert_eq!(x.is_even(), e); assert_eq!(x.is_even(), e);
assert_eq!(x.is_odd(), o); assert_eq!(x.is_odd(), o);
assert_eq!(x.testbit(b), t);
x.mask(usize::from(&m)); x.mask(usize::from(&m));
assert_eq!(x, r); assert_eq!(x, r);
}); });

View File

@@ -6,7 +6,7 @@ module Tests(
where where
import Control.Exception(assert) import Control.Exception(assert)
import Data.Bits(shiftL,shiftR) import Data.Bits(shiftL,shiftR,testBit)
import Data.Map.Strict(Map) import Data.Map.Strict(Map)
import qualified Data.Map.Strict as Map import qualified Data.Map.Strict as Map
import Database import Database
@@ -80,12 +80,15 @@ baseTest :: Test
baseTest size memory0 = baseTest size memory0 =
let (x, memory1) = generateNum memory0 "x" size let (x, memory1) = generateNum memory0 "x" size
(m, memory2) = generateNum memory1 "m" size (m, memory2) = generateNum memory1 "m" size
(b, memory3) = generateNum memory2 "b" 16
m' = m `mod` (fromIntegral size `div` 64) m' = m `mod` (fromIntegral size `div` 64)
r = x `mod` (2 ^ (64 * m')) r = x `mod` (2 ^ (64 * m'))
t = x `testBit` (fromIntegral b)
res = Map.fromList [("x", showX x), ("z", showB (x == 0)), res = Map.fromList [("x", showX x), ("z", showB (x == 0)),
("e", showB (even x)), ("o", showB (odd x)), ("e", showB (even x)), ("o", showB (odd x)),
("m", showX m'), ("r", showX r)] ("m", showX m'), ("r", showX r),
in (res, x, memory2) ("b", showX b), ("t", showB t)]
in (res, x, memory3)
compareTest :: Test compareTest :: Test
compareTest size memory0 = compareTest size memory0 =

7790
testdata/base/00192.test vendored

File diff suppressed because it is too large Load Diff

8134
testdata/base/00256.test vendored

File diff suppressed because it is too large Load Diff

8336
testdata/base/00320.test vendored

File diff suppressed because it is too large Load Diff

8464
testdata/base/00384.test vendored

File diff suppressed because it is too large Load Diff

8534
testdata/base/00448.test vendored

File diff suppressed because it is too large Load Diff

8536
testdata/base/00512.test vendored

File diff suppressed because it is too large Load Diff

8616
testdata/base/00576.test vendored

File diff suppressed because it is too large Load Diff

8738
testdata/base/00640.test vendored

File diff suppressed because it is too large Load Diff

8778
testdata/base/00704.test vendored

File diff suppressed because it is too large Load Diff

8808
testdata/base/00768.test vendored

File diff suppressed because it is too large Load Diff

12956
testdata/base/00896.test vendored

File diff suppressed because it is too large Load Diff

12950
testdata/base/00960.test vendored

File diff suppressed because it is too large Load Diff

12894
testdata/base/01024.test vendored

File diff suppressed because it is too large Load Diff

12732
testdata/base/01088.test vendored

File diff suppressed because it is too large Load Diff

13070
testdata/base/01152.test vendored

File diff suppressed because it is too large Load Diff

13270
testdata/base/01280.test vendored

File diff suppressed because it is too large Load Diff

12782
testdata/base/01344.test vendored

File diff suppressed because it is too large Load Diff

13106
testdata/base/01536.test vendored

File diff suppressed because it is too large Load Diff

13210
testdata/base/01600.test vendored

File diff suppressed because it is too large Load Diff

12868
testdata/base/01664.test vendored

File diff suppressed because it is too large Load Diff

12858
testdata/base/01792.test vendored

File diff suppressed because it is too large Load Diff

13298
testdata/base/02048.test vendored

File diff suppressed because it is too large Load Diff

13176
testdata/base/02112.test vendored

File diff suppressed because it is too large Load Diff

13558
testdata/base/02176.test vendored

File diff suppressed because it is too large Load Diff

13702
testdata/base/02304.test vendored

File diff suppressed because it is too large Load Diff

13140
testdata/base/02560.test vendored

File diff suppressed because it is too large Load Diff

13244
testdata/base/03072.test vendored

File diff suppressed because it is too large Load Diff

13576
testdata/base/03136.test vendored

File diff suppressed because it is too large Load Diff

13040
testdata/base/03200.test vendored

File diff suppressed because it is too large Load Diff

13384
testdata/base/04096.test vendored

File diff suppressed because it is too large Load Diff

13200
testdata/base/04160.test vendored

File diff suppressed because it is too large Load Diff

13488
testdata/base/04224.test vendored

File diff suppressed because it is too large Load Diff

13736
testdata/base/06144.test vendored

File diff suppressed because it is too large Load Diff

13498
testdata/base/06208.test vendored

File diff suppressed because it is too large Load Diff

13636
testdata/base/06272.test vendored

File diff suppressed because it is too large Load Diff

13636
testdata/base/07680.test vendored

File diff suppressed because it is too large Load Diff

13438
testdata/base/07744.test vendored

File diff suppressed because it is too large Load Diff

13284
testdata/base/07808.test vendored

File diff suppressed because it is too large Load Diff

13360
testdata/base/08192.test vendored

File diff suppressed because it is too large Load Diff

13532
testdata/base/08256.test vendored

File diff suppressed because it is too large Load Diff

13580
testdata/base/08320.test vendored

File diff suppressed because it is too large Load Diff

13234
testdata/base/08448.test vendored

File diff suppressed because it is too large Load Diff

13312
testdata/base/12288.test vendored

File diff suppressed because it is too large Load Diff

13286
testdata/base/12416.test vendored

File diff suppressed because it is too large Load Diff

13752
testdata/base/15360.test vendored

File diff suppressed because it is too large Load Diff

13538
testdata/base/15424.test vendored

File diff suppressed because it is too large Load Diff

13514
testdata/base/15488.test vendored

File diff suppressed because it is too large Load Diff

13792
testdata/base/16384.test vendored

File diff suppressed because it is too large Load Diff

13696
testdata/base/16448.test vendored

File diff suppressed because it is too large Load Diff

13632
testdata/base/16512.test vendored

File diff suppressed because it is too large Load Diff

13608
testdata/base/16640.test vendored

File diff suppressed because it is too large Load Diff

13684
testdata/base/24832.test vendored

File diff suppressed because one or more lines are too long

13702
testdata/base/30720.test vendored

File diff suppressed because one or more lines are too long

13580
testdata/base/30784.test vendored

File diff suppressed because one or more lines are too long

13638
testdata/base/30848.test vendored

File diff suppressed because one or more lines are too long

13778
testdata/base/32768.test vendored

File diff suppressed because one or more lines are too long

13872
testdata/base/32896.test vendored

File diff suppressed because one or more lines are too long

13562
testdata/base/61440.test vendored

File diff suppressed because one or more lines are too long

13776
testdata/base/61568.test vendored

File diff suppressed because one or more lines are too long