require ("math")
|
|
module('bit', package.seeall) -- 实现按位运算
|
|
|
|
--默认按32位
|
|
local __bitNum = 32
|
|
|
|
--设置位数
|
|
function setBitNum(bitNum)
|
|
__bitNum = bitNum
|
|
end
|
|
|
|
--按位同或
|
|
function bxnor(int1, int2)
|
|
return __operaByBit(__bitxnor, int1, int2)
|
|
end
|
|
|
|
--按位异或
|
|
function bxor(int1, int2)
|
|
return __operaByBit(__bitxor, int1, int2)
|
|
end
|
|
|
|
--按位与
|
|
function band(int1, int2)
|
|
return __operaByBit(__bitand, int1, int2)
|
|
end
|
|
|
|
--按位或
|
|
function bor(int1, int2)
|
|
return __operaByBit(__bitor, int1, int2)
|
|
end
|
|
|
|
--按位非
|
|
function bnot(integer)
|
|
return __operaByBit(__bitnot, integer)
|
|
end
|
|
|
|
--按位操作
|
|
function __operaByBit(bitFunc, ...)
|
|
local bDataLst = {}
|
|
|
|
for i = 1, select("#", ...) do
|
|
local bData = itob(select(i, ...))
|
|
table.insert(bDataLst, bData)
|
|
end
|
|
|
|
for _, bData in ipairs(bDataLst) do
|
|
for i = #bData + 1, __bitNum do
|
|
table.insert(bData, 1, 0)
|
|
end
|
|
end
|
|
|
|
local resData = {}
|
|
for i = 1, __bitNum do
|
|
local args = {}
|
|
for _, bData in ipairs(bDataLst) do
|
|
table.insert(args, bData[i])
|
|
end
|
|
table.insert(resData, bitFunc(unpack(args)))
|
|
end
|
|
|
|
return btoi(resData)
|
|
end
|
|
|
|
--按位同或
|
|
function __bitxnor(bit1, bit2)
|
|
return (bit1 == bit2) and 1 or 0
|
|
end
|
|
|
|
--按位异或
|
|
function __bitxor(bit1, bit2)
|
|
return (bit1 == bit2) and 0 or 1
|
|
end
|
|
|
|
--按位与
|
|
function __bitand(bit1, bit2)
|
|
return (bit1 == 1 and bit2 == 1) and 1 or 0
|
|
end
|
|
|
|
--按位或
|
|
function __bitor(bit1, bit2)
|
|
return (bit1 == 1 or bit2 == 1) and 1 or 0
|
|
end
|
|
|
|
--按位非
|
|
function __bitnot(bit)
|
|
return 1 - bit
|
|
end
|
|
|
|
--2进制转换成10进制
|
|
function btoi(bData)
|
|
return __ntoi(bData, 2)
|
|
end
|
|
|
|
--10进制转换成2进制
|
|
function itob(integer)
|
|
return __iton(integer, 2)
|
|
end
|
|
|
|
--10进制转换成N进制
|
|
function __iton(integer, num)
|
|
assert(type(integer) == "number")
|
|
|
|
if integer == 0 then
|
|
return {0}
|
|
end
|
|
|
|
local bNeg = integer < 0
|
|
local ci = math.abs(integer)
|
|
|
|
local nData = {}
|
|
while ci > 0 do
|
|
table.insert(nData, 1, ci % num)
|
|
ci = math.floor(ci / num)
|
|
end
|
|
|
|
if bNeg then
|
|
for i = #nData + 1, __bitNum do
|
|
table.insert(nData, 1, num - 1)
|
|
end
|
|
end
|
|
|
|
return nData
|
|
end
|
|
|
|
--N进制转换成10进制
|
|
function __ntoi(nData, num)
|
|
assert(type(nData) == "table")
|
|
|
|
local integer = 0
|
|
for i, data in ipairs(nData) do
|
|
integer = integer + data * math.pow(num, #nData - i)
|
|
end
|
|
|
|
return integer
|
|
end
|
|
|