wishful/mods/wislib/lua5_1/bitwise.lua

127 lines
2.7 KiB
Lua
Raw Permalink Normal View History

2025-02-07 14:39:37 -05:00
--[[
AND (&): Performs a bitwise AND operation.
OR (|): Performs a bitwise OR operation.
XOR (~): Performs a bitwise exclusive OR operation.
NOT (~): Performs a unary bitwise NOT operation.
Left Shift (<<): Shifts bits to the left.
Right Shift (>>): Shifts bits to the right12.
2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
31, 37, 41, 43, 47, 53, 59, 61, 67,
71, 73, 79, 83, 89, 97, 101,
103, 107, 109, 113, 127, 131,
137, 139, 149, 151,
157, 163, 167, 173, 179, 181, 191,
193, 197, 199, 211, 223, 227, 229, 233,
239, 241, 251, 257, 263, 269, 271, 277,
281, 283, 293, 307, 311, 313,
317, 331, 337, 347, 349, 353,
359, 367, 373, 379, 383,
389, 397, 401, 409, 419, 421, 431, 433, 439,
443, 449, 457, 461, 463, 467, 479, 487, 491, 499,
503, 509, 521, 523, 541, 547, 557, 563, 569, 571,
577, 587, 593, 599, 601, 607, 613, 617, 619, 631,
641, 643, 647, 653, 659, 661, 673, 677, 683, 691,
701, 709, 719, 727, 733, 739, 743, 751, 757, 761,
769, 773, 787, 797, 809, 811, 821, 823, 827, 829,
839, 853, 857, 859, 863, 877, 881, 883, 887, 907,
911, 919, 929, 937, 941, 947, 953, 967, 971, 977,
983, 991, 997
--]]
-- Bitwise AND
function band(a, b)
local result = 0
local bitval = 1
while a > 0 and b > 0 do
local abit = a % 2
local bbit = b % 2
if abit == 1 and bbit == 1 then
result = result + bitval
end
a = math.floor(a / 2)
b = math.floor(b / 2)
bitval = bitval * 2
end
return result
end
-- Bitwise OR
function bor(a, b)
local result = 0
local bitval = 1
while a > 0 or b > 0 do
local abit = a % 2
local bbit = b % 2
if abit == 1 or bbit == 1 then
result = result + bitval
end
a = math.floor(a / 2)
b = math.floor(b / 2)
bitval = bitval * 2
end
return result
end
-- Bitwise XOR
function bxor(a, b)
local result = 0
local bitval = 1
while a > 0 or b > 0 do
local abit = a % 2
local bbit = b % 2
if abit ~= bbit then
result = result + bitval
end
a = math.floor(a / 2)
b = math.floor(b / 2)
bitval = bitval * 2
end
return result
end
-- Bitwise NOT
function bnot(a)
local result = 0
local bitval = 1
while a > 0 do
local abit = a % 2
if abit == 0 then
result = result + bitval
end
a = math.floor(a / 2)
bitval = bitval * 2
end
return result
end
-- Left shift
function lshift(x, by)
return x * 2 ^ by
end
-- Right shift
function rshift(x, by)
return math.floor(x / 2 ^ by)
end
local gen_bitwise_assert = function(a,b)
print("AND: ", band(a, b))
print("OR: ", bor(a, b))
print("XOR: ", bxor(a, b))
print("NOT: ", bnot(271))
print("Left Shift: ", lshift(a, 1))
print("Right Shift: ", rshift(a, 1))
end
local a, b = 127, 271
--gen_bitwise_assert(a,b)
assert(band(a, b) == 15)
assert(bor(a, b) == 383)
assert(bxor(a, b) == 368)
assert(bnot(b) == 240)
assert(lshift(a, 1) == 254)
assert(rshift(a, 1) == 63)