在go中使用lua示例, 基于gopher-lua!
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 

136 lignes
2.4 KiB

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