nanvm_lib/vm/bigint/
bitxor.rs1use core::ops::BitXor;
2
3use crate::vm::{BigInt, IVm};
4
5impl<A: IVm> BitXor for BigInt<A> {
6 type Output = Self;
7 fn bitxor(self, rhs: Self) -> Self::Output {
8 self.bitwise_op(rhs, |a, b| a ^ b, |a_neg, b_neg| a_neg != b_neg)
9 }
10}
11
12#[cfg(test)]
13mod tests {
14 use crate::vm::bigint::test_util::{int, neg, pos};
15
16 #[test]
17 fn both_positive() {
18 assert_eq!(int(0b1100) ^ int(0b1010), int(0b0110));
19 }
20
21 #[test]
22 fn both_negative() {
23 assert_eq!(int(-1) ^ int(-1), int(0));
25 assert_eq!(int(-2) ^ int(-3), int(3));
27 }
28
29 #[test]
30 fn mixed_signs() {
31 assert_eq!(int(5) ^ int(-1), int(-6));
33 assert_eq!(int(-1) ^ int(5), int(-6));
34 }
35
36 #[test]
37 fn with_zero() {
38 assert_eq!(int(0) ^ int(0), int(0));
39 assert_eq!(int(12_345) ^ int(0), int(12_345));
40 assert_eq!(int(-12_345) ^ int(0), int(-12_345));
41 }
42
43 #[test]
44 fn multi_word_carry_on_decode() {
45 let x = neg([0xFFFF_FFFF_0000_0001u64]);
51 let y = pos([0x0000_0000_FFFF_FFFFu64]);
52 let expected = neg([0u64, 1u64]);
53 assert_eq!(x ^ y, expected);
54 }
55}