Add a testbit() operationg.
This commit is contained in:
@@ -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)]
|
||||||
|
|||||||
@@ -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);
|
||||||
assert_eq!(x.is_zero(), z);
|
let b = usize::from($name::from_bytes(bbytes));
|
||||||
assert_eq!(x.is_even(), e);
|
println!("b: {:x}", b);
|
||||||
assert_eq!(x.is_odd(), o);
|
let t = 1 == tbytes[0];
|
||||||
|
assert_eq!(x.is_zero(), z);
|
||||||
|
assert_eq!(x.is_even(), e);
|
||||||
|
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);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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
7790
testdata/base/00192.test
vendored
File diff suppressed because it is too large
Load Diff
8134
testdata/base/00256.test
vendored
8134
testdata/base/00256.test
vendored
File diff suppressed because it is too large
Load Diff
8336
testdata/base/00320.test
vendored
8336
testdata/base/00320.test
vendored
File diff suppressed because it is too large
Load Diff
8464
testdata/base/00384.test
vendored
8464
testdata/base/00384.test
vendored
File diff suppressed because it is too large
Load Diff
8534
testdata/base/00448.test
vendored
8534
testdata/base/00448.test
vendored
File diff suppressed because it is too large
Load Diff
8536
testdata/base/00512.test
vendored
8536
testdata/base/00512.test
vendored
File diff suppressed because it is too large
Load Diff
8616
testdata/base/00576.test
vendored
8616
testdata/base/00576.test
vendored
File diff suppressed because it is too large
Load Diff
8738
testdata/base/00640.test
vendored
8738
testdata/base/00640.test
vendored
File diff suppressed because it is too large
Load Diff
8778
testdata/base/00704.test
vendored
8778
testdata/base/00704.test
vendored
File diff suppressed because it is too large
Load Diff
8808
testdata/base/00768.test
vendored
8808
testdata/base/00768.test
vendored
File diff suppressed because it is too large
Load Diff
12956
testdata/base/00896.test
vendored
12956
testdata/base/00896.test
vendored
File diff suppressed because it is too large
Load Diff
12950
testdata/base/00960.test
vendored
12950
testdata/base/00960.test
vendored
File diff suppressed because it is too large
Load Diff
12894
testdata/base/01024.test
vendored
12894
testdata/base/01024.test
vendored
File diff suppressed because it is too large
Load Diff
12732
testdata/base/01088.test
vendored
12732
testdata/base/01088.test
vendored
File diff suppressed because it is too large
Load Diff
13070
testdata/base/01152.test
vendored
13070
testdata/base/01152.test
vendored
File diff suppressed because it is too large
Load Diff
13270
testdata/base/01280.test
vendored
13270
testdata/base/01280.test
vendored
File diff suppressed because it is too large
Load Diff
12782
testdata/base/01344.test
vendored
12782
testdata/base/01344.test
vendored
File diff suppressed because it is too large
Load Diff
13106
testdata/base/01536.test
vendored
13106
testdata/base/01536.test
vendored
File diff suppressed because it is too large
Load Diff
13210
testdata/base/01600.test
vendored
13210
testdata/base/01600.test
vendored
File diff suppressed because it is too large
Load Diff
12868
testdata/base/01664.test
vendored
12868
testdata/base/01664.test
vendored
File diff suppressed because it is too large
Load Diff
12858
testdata/base/01792.test
vendored
12858
testdata/base/01792.test
vendored
File diff suppressed because it is too large
Load Diff
13298
testdata/base/02048.test
vendored
13298
testdata/base/02048.test
vendored
File diff suppressed because it is too large
Load Diff
13176
testdata/base/02112.test
vendored
13176
testdata/base/02112.test
vendored
File diff suppressed because it is too large
Load Diff
13558
testdata/base/02176.test
vendored
13558
testdata/base/02176.test
vendored
File diff suppressed because it is too large
Load Diff
13702
testdata/base/02304.test
vendored
13702
testdata/base/02304.test
vendored
File diff suppressed because it is too large
Load Diff
13140
testdata/base/02560.test
vendored
13140
testdata/base/02560.test
vendored
File diff suppressed because it is too large
Load Diff
13244
testdata/base/03072.test
vendored
13244
testdata/base/03072.test
vendored
File diff suppressed because it is too large
Load Diff
13576
testdata/base/03136.test
vendored
13576
testdata/base/03136.test
vendored
File diff suppressed because it is too large
Load Diff
13040
testdata/base/03200.test
vendored
13040
testdata/base/03200.test
vendored
File diff suppressed because it is too large
Load Diff
13384
testdata/base/04096.test
vendored
13384
testdata/base/04096.test
vendored
File diff suppressed because it is too large
Load Diff
13200
testdata/base/04160.test
vendored
13200
testdata/base/04160.test
vendored
File diff suppressed because it is too large
Load Diff
13488
testdata/base/04224.test
vendored
13488
testdata/base/04224.test
vendored
File diff suppressed because it is too large
Load Diff
13736
testdata/base/06144.test
vendored
13736
testdata/base/06144.test
vendored
File diff suppressed because it is too large
Load Diff
13498
testdata/base/06208.test
vendored
13498
testdata/base/06208.test
vendored
File diff suppressed because it is too large
Load Diff
13636
testdata/base/06272.test
vendored
13636
testdata/base/06272.test
vendored
File diff suppressed because it is too large
Load Diff
13636
testdata/base/07680.test
vendored
13636
testdata/base/07680.test
vendored
File diff suppressed because it is too large
Load Diff
13438
testdata/base/07744.test
vendored
13438
testdata/base/07744.test
vendored
File diff suppressed because it is too large
Load Diff
13284
testdata/base/07808.test
vendored
13284
testdata/base/07808.test
vendored
File diff suppressed because it is too large
Load Diff
13360
testdata/base/08192.test
vendored
13360
testdata/base/08192.test
vendored
File diff suppressed because it is too large
Load Diff
13532
testdata/base/08256.test
vendored
13532
testdata/base/08256.test
vendored
File diff suppressed because it is too large
Load Diff
13580
testdata/base/08320.test
vendored
13580
testdata/base/08320.test
vendored
File diff suppressed because it is too large
Load Diff
13234
testdata/base/08448.test
vendored
13234
testdata/base/08448.test
vendored
File diff suppressed because it is too large
Load Diff
13312
testdata/base/12288.test
vendored
13312
testdata/base/12288.test
vendored
File diff suppressed because it is too large
Load Diff
13286
testdata/base/12416.test
vendored
13286
testdata/base/12416.test
vendored
File diff suppressed because it is too large
Load Diff
13752
testdata/base/15360.test
vendored
13752
testdata/base/15360.test
vendored
File diff suppressed because it is too large
Load Diff
13538
testdata/base/15424.test
vendored
13538
testdata/base/15424.test
vendored
File diff suppressed because it is too large
Load Diff
13514
testdata/base/15488.test
vendored
13514
testdata/base/15488.test
vendored
File diff suppressed because it is too large
Load Diff
13792
testdata/base/16384.test
vendored
13792
testdata/base/16384.test
vendored
File diff suppressed because it is too large
Load Diff
13696
testdata/base/16448.test
vendored
13696
testdata/base/16448.test
vendored
File diff suppressed because it is too large
Load Diff
13632
testdata/base/16512.test
vendored
13632
testdata/base/16512.test
vendored
File diff suppressed because it is too large
Load Diff
13608
testdata/base/16640.test
vendored
13608
testdata/base/16640.test
vendored
File diff suppressed because it is too large
Load Diff
13684
testdata/base/24832.test
vendored
13684
testdata/base/24832.test
vendored
File diff suppressed because one or more lines are too long
13702
testdata/base/30720.test
vendored
13702
testdata/base/30720.test
vendored
File diff suppressed because one or more lines are too long
13580
testdata/base/30784.test
vendored
13580
testdata/base/30784.test
vendored
File diff suppressed because one or more lines are too long
13638
testdata/base/30848.test
vendored
13638
testdata/base/30848.test
vendored
File diff suppressed because one or more lines are too long
13778
testdata/base/32768.test
vendored
13778
testdata/base/32768.test
vendored
File diff suppressed because one or more lines are too long
13872
testdata/base/32896.test
vendored
13872
testdata/base/32896.test
vendored
File diff suppressed because one or more lines are too long
13562
testdata/base/61440.test
vendored
13562
testdata/base/61440.test
vendored
File diff suppressed because one or more lines are too long
13776
testdata/base/61568.test
vendored
13776
testdata/base/61568.test
vendored
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user