mirror of
https://github.com/ziglang/zig.git
synced 2026-01-01 11:03:11 +00:00
Merge pull request #701 from Hejsil/fix-xor-with-zero
Fixed bigint_xor for none negative numbers
This commit is contained in:
commit
a4e8e55908
@ -1271,6 +1271,12 @@ void bigint_and(BigInt *dest, const BigInt *op1, const BigInt *op2) {
|
||||
}
|
||||
|
||||
void bigint_xor(BigInt *dest, const BigInt *op1, const BigInt *op2) {
|
||||
if (op1->digit_count == 0) {
|
||||
return bigint_init_bigint(dest, op2);
|
||||
}
|
||||
if (op2->digit_count == 0) {
|
||||
return bigint_init_bigint(dest, op1);
|
||||
}
|
||||
if (op1->is_negative || op2->is_negative) {
|
||||
// TODO this code path is untested
|
||||
size_t big_bit_count = max(bigint_bits_needed(op1), bigint_bits_needed(op2));
|
||||
@ -1289,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;
|
||||
|
||||
@ -349,6 +349,32 @@ 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);
|
||||
assert(0xFFFFFFFF00000000FFFFFFFF00000000 ^ 0x00000000FFFFFFFF00000000FFFFFFFF == 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
|
||||
assert(0xFFFFFFFF00000000FFFFFFFF00000000 ^ 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF == 0x00000000FFFFFFFF00000000FFFFFFFF);
|
||||
assert(0x00000000FFFFFFFF00000000FFFFFFFF ^ 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF == 0xFFFFFFFF00000000FFFFFFFF00000000);
|
||||
}
|
||||
}
|
||||
|
||||
test "f128" {
|
||||
test_f128();
|
||||
comptime test_f128();
|
||||
@ -368,4 +394,4 @@ fn test_f128() {
|
||||
|
||||
fn should_not_be_zero(x: f128) {
|
||||
assert(x != 0.0);
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user