|
|
- 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
-
|