Commit fa2c3be341

Jimmi Holst Christensen <jhc@liab.dk>
2018-01-17 14:31:47
More tests, and fixed none negative bigint xor
1 parent db0fc32
Changed files (2)
src
test
cases
src/bigint.cpp
@@ -1295,14 +1295,16 @@ void bigint_xor(BigInt *dest, const BigInt *op1, const BigInt *op2) {
         dest->is_negative = false;
         const uint64_t *op1_digits = bigint_ptr(op1);
         const uint64_t *op2_digits = bigint_ptr(op2);
+
+        assert(op1->digit_count > 0 && op2->digit_count > 0);
+        uint64_t first_digit = op1_digits[0] ^ op2_digits[0];
         if (op1->digit_count == 1 && op2->digit_count == 1) {
             dest->digit_count = 1;
-            dest->data.digit = op1_digits[0] ^ op2_digits[0];
+            dest->data.digit = first_digit;
             bigint_normalize(dest);
             return;
         }
         // TODO this code path is untested
-        uint64_t first_digit = dest->data.digit;
         dest->digit_count = max(op1->digit_count, op2->digit_count);
         dest->data.digits = allocate_nonzero<uint64_t>(dest->digit_count);
         dest->data.digits[0] = first_digit;
test/cases/math.zig
@@ -349,6 +349,29 @@ test "big number shifting" {
     }
 }
 
+test "xor" {
+    test_xor();
+    comptime test_xor();
+}
+
+fn test_xor() {
+    assert(0xFF ^ 0x00 == 0xFF);
+    assert(0xF0 ^ 0x0F == 0xFF);
+    assert(0xFF ^ 0xF0 == 0x0F);
+    assert(0xFF ^ 0x0F == 0xF0);
+    assert(0xFF ^ 0xFF == 0x00);
+}
+
+test "big number xor" {
+    comptime {
+        assert(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ^ 0x00000000000000000000000000000000 == 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
+        assert(0xFFFFFFFFFFFFFFFF0000000000000000 ^ 0x0000000000000000FFFFFFFFFFFFFFFF == 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
+        assert(0xFFFFFFFFFFFFFFFF0000000000000000 ^ 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF == 0x0000000000000000FFFFFFFFFFFFFFFF);
+        assert(0x0000000000000000FFFFFFFFFFFFFFFF ^ 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF == 0xFFFFFFFFFFFFFFFF0000000000000000);
+        assert(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ^ 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF == 0x00000000000000000000000000000000);
+    }
+}
+
 test "f128" {
     test_f128();
     comptime test_f128();
@@ -368,9 +391,4 @@ fn test_f128() {
 
 fn should_not_be_zero(x: f128) {
     assert(x != 0.0);
-}
-
-test "xor with zero" {
-    assert(0xFF ^ 0x00 == 0xFF);
-    comptime assert(0xFF ^ 0x00 == 0xFF);
-}
+}
\ No newline at end of file