---
source: src/main.rs
expression: compiled
input_file: test-data/lua5.2-tests/bitwise.lua
---
print("testing bitwise operations");
assert(bit32.band() == bit32.bnot(0));
assert(bit32.btest() == true);
assert(bit32.bor() == 0);
assert(bit32.bxor() == 0);
assert(bit32.band() == bit32.band(0xffffffff));
assert(bit32.band(1, 2) == 0);
assert(bit32.band(-1) == 0xffffffff);
assert(bit32.band(2 ^ 33 - 1) == 0xffffffff);
assert(bit32.band(-2 ^ 33 - 1) == 0xffffffff);
assert(bit32.band(2 ^ 33 + 1) == 1);
assert(bit32.band(-2 ^ 33 + 1) == 1);
assert(bit32.band(-2 ^ 40) == 0);
assert(bit32.band(2 ^ 40) == 0);
assert(bit32.band(-2 ^ 40 - 2) == 0xfffffffe);
assert(bit32.band(2 ^ 40 - 4) == 0xfffffffc);
assert(bit32.lrotate(0, -1) == 0);
assert(bit32.lrotate(0, 7) == 0);
assert(bit32.lrotate(0x12345678, 4) == 0x23456781);
assert(bit32.rrotate(0x12345678, -4) == 0x23456781);
assert(bit32.lrotate(0x12345678, -8) == 0x78123456);
assert(bit32.rrotate(0x12345678, 8) == 0x78123456);
assert(bit32.lrotate(0xaaaaaaaa, 2) == 0xaaaaaaaa);
assert(bit32.lrotate(0xaaaaaaaa, -2) == 0xaaaaaaaa);
for i = -50, 50 {
assert(bit32.lrotate(0x89abcdef, i) == bit32.lrotate(0x89abcdef, i % 32));
}
assert(bit32.lshift(0x12345678, 4) == 0x23456780);
assert(bit32.lshift(0x12345678, 8) == 0x34567800);
assert(bit32.lshift(0x12345678, -4) == 0x01234567);
assert(bit32.lshift(0x12345678, -8) == 0x00123456);
assert(bit32.lshift(0x12345678, 32) == 0);
assert(bit32.lshift(0x12345678, -32) == 0);
assert(bit32.rshift(0x12345678, 4) == 0x01234567);
assert(bit32.rshift(0x12345678, 8) == 0x00123456);
assert(bit32.rshift(0x12345678, 32) == 0);
assert(bit32.rshift(0x12345678, -32) == 0);
assert(bit32.arshift(0x12345678, 0) == 0x12345678);
assert(bit32.arshift(0x12345678, 1) == 0x12345678 / 2);
assert(bit32.arshift(0x12345678, -1) == 0x12345678 * 2);
assert(bit32.arshift(-1, 1) == 0xffffffff);
assert(bit32.arshift(-1, 24) == 0xffffffff);
assert(bit32.arshift(-1, 32) == 0xffffffff);
assert(bit32.arshift(-1, -1) == (-1 * 2) % 2 ^ 32);
print("+");
local c = {
0,
1,
2,
3,
10,
0x80000000,
0xaaaaaaaa,
0x55555555,
0xffffffff,
0x7fffffff
}
for _, b with pairs(c) {
assert(bit32.band(b) == b);
assert(bit32.band(b, b) == b);
assert(bit32.btest(b, b) == (b != 0));
assert(bit32.band(b, b, b) == b);
assert(bit32.btest(b, b, b) == (b != 0));
assert(bit32.band(b, bit32.bnot(b)) == 0);
assert(bit32.bor(b, bit32.bnot(b)) == bit32.bnot(0));
assert(bit32.bor(b) == b);
assert(bit32.bor(b, b) == b);
assert(bit32.bor(b, b, b) == b);
assert(bit32.bxor(b) == b);
assert(bit32.bxor(b, b) == 0);
assert(bit32.bxor(b, 0) == b);
assert(bit32.bnot(b) != b);
assert(bit32.bnot(bit32.bnot(b)) == b);
assert(bit32.bnot(b) == 2 ^ 32 - 1 - b);
assert(bit32.lrotate(b, 32) == b);
assert(bit32.rrotate(b, 32) == b);
assert(bit32.lshift(bit32.lshift(b, -4), 4) == bit32.band(b, bit32.bnot(0xf)));
assert(bit32.rshift(bit32.rshift(b, 4), -4) == bit32.band(b, bit32.bnot(0xf)));
for i = -40, 40 {
assert(bit32.lshift(b, i) == math.floor((b * 2 ^ i) % 2 ^ 32));
}
}
assert(!pcall(bit32.band, {}));
assert(!pcall(bit32.bnot, "a"));
assert(!pcall(bit32.lshift, 45));
assert(!pcall(bit32.lshift, 45, print));
assert(!pcall(bit32.rshift, 45, print));
print("+");
assert(bit32.extract(0x12345678, 0, 4) == 8);
assert(bit32.extract(0x12345678, 4, 4) == 7);
assert(bit32.extract(0xa0001111, 28, 4) == 0xa);
assert(bit32.extract(0xa0001111, 31, 1) == 1);
assert(bit32.extract(0x50000111, 31, 1) == 0);
assert(bit32.extract(0xf2345679, 0, 32) == 0xf2345679);
assert(!pcall(bit32.extract, 0, -1));
assert(!pcall(bit32.extract, 0, 32));
assert(!pcall(bit32.extract, 0, 0, 33));
assert(!pcall(bit32.extract, 0, 31, 2));
assert(bit32.replace(0x12345678, 5, 28, 4) == 0x52345678);
assert(bit32.replace(0x12345678, 0x87654321, 0, 32) == 0x87654321);
assert(bit32.replace(0, 1, 2) == 2 ^ 2);
assert(bit32.replace(0, -1, 4) == 2 ^ 4);
assert(bit32.replace(-1, 0, 31) == 2 ^ 31 - 1);
assert(bit32.replace(-1, 0, 1, 2) == 2 ^ 32 - 7);
print('OK');