Skip to content

Commit ed695d4

Browse files
committed
auto merge of rust-lang#9083 : dcrewi/rust/biguint-bit-ops, r=brson
2 parents 54ae280 + c3d0fc2 commit ed695d4

File tree

1 file changed

+79
-0
lines changed

1 file changed

+79
-0
lines changed

src/libextra/num/bigint.rs

+79
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,43 @@ impl Orderable for BigUint {
153153
}
154154
}
155155

156+
impl BitAnd<BigUint, BigUint> for BigUint {
157+
fn bitand(&self, other: &BigUint) -> BigUint {
158+
let new_len = num::min(self.data.len(), other.data.len());
159+
let anded = do vec::from_fn(new_len) |i| {
160+
// i will never be less than the size of either data vector
161+
let ai = self.data[i];
162+
let bi = other.data[i];
163+
ai & bi
164+
};
165+
return BigUint::new(anded);
166+
}
167+
}
168+
169+
impl BitOr<BigUint, BigUint> for BigUint {
170+
fn bitor(&self, other: &BigUint) -> BigUint {
171+
let new_len = num::max(self.data.len(), other.data.len());
172+
let ored = do vec::from_fn(new_len) |i| {
173+
let ai = if i < self.data.len() { self.data[i] } else { 0 };
174+
let bi = if i < other.data.len() { other.data[i] } else { 0 };
175+
ai | bi
176+
};
177+
return BigUint::new(ored);
178+
}
179+
}
180+
181+
impl BitXor<BigUint, BigUint> for BigUint {
182+
fn bitxor(&self, other: &BigUint) -> BigUint {
183+
let new_len = num::max(self.data.len(), other.data.len());
184+
let xored = do vec::from_fn(new_len) |i| {
185+
let ai = if i < self.data.len() { self.data[i] } else { 0 };
186+
let bi = if i < other.data.len() { other.data[i] } else { 0 };
187+
ai ^ bi
188+
};
189+
return BigUint::new(xored);
190+
}
191+
}
192+
156193
impl Shl<uint, BigUint> for BigUint {
157194
#[inline]
158195
fn shl(&self, rhs: &uint) -> BigUint {
@@ -1166,6 +1203,48 @@ mod biguint_tests {
11661203
}
11671204
}
11681205
1206+
#[test]
1207+
fn test_bitand() {
1208+
fn check(left: ~[BigDigit],
1209+
right: ~[BigDigit],
1210+
expected: ~[BigDigit]) {
1211+
assert_eq!(BigUint::new(left) & BigUint::new(right),
1212+
BigUint::new(expected));
1213+
}
1214+
check(~[], ~[], ~[]);
1215+
check(~[268, 482, 17],
1216+
~[964, 54],
1217+
~[260, 34]);
1218+
}
1219+
1220+
#[test]
1221+
fn test_bitor() {
1222+
fn check(left: ~[BigDigit],
1223+
right: ~[BigDigit],
1224+
expected: ~[BigDigit]) {
1225+
assert_eq!(BigUint::new(left) | BigUint::new(right),
1226+
BigUint::new(expected));
1227+
}
1228+
check(~[], ~[], ~[]);
1229+
check(~[268, 482, 17],
1230+
~[964, 54],
1231+
~[972, 502, 17]);
1232+
}
1233+
1234+
#[test]
1235+
fn test_bitxor() {
1236+
fn check(left: ~[BigDigit],
1237+
right: ~[BigDigit],
1238+
expected: ~[BigDigit]) {
1239+
assert_eq!(BigUint::new(left) ^ BigUint::new(right),
1240+
BigUint::new(expected));
1241+
}
1242+
check(~[], ~[], ~[]);
1243+
check(~[268, 482, 17],
1244+
~[964, 54],
1245+
~[712, 468, 17]);
1246+
}
1247+
11691248
#[test]
11701249
fn test_shl() {
11711250
fn check(s: &str, shift: uint, ans: &str) {

0 commit comments

Comments
 (0)