Luaでビット演算を実現
2126 ワード
前言
パッケージのアクティブ化コードを作るときにアクティブ化コードをいくつかビット演算する必要があるので、このモジュールを書きました.一般的にこれらのビット演算の操作はやはりC++の中で書くことを提案して、ゲームはすでに出したため、ただ自動更新でこの機能を更新したいだけで、仕方なく先にLUAで実現するしかありません.友達がいてもC++の更新が不便で、LUAだけで実現したいなら、ここで手伝ってほしいです.
コード#コード#
パッケージのアクティブ化コードを作るときにアクティブ化コードをいくつかビット演算する必要があるので、このモジュールを書きました.一般的にこれらのビット演算の操作はやはりC++の中で書くことを提案して、ゲームはすでに出したため、ただ自動更新でこの機能を更新したいだけで、仕方なく先にLUAで実現するしかありません.友達がいてもC++の更新が不便で、LUAだけで実現したいなら、ここで手伝ってほしいです.
コード#コード#
module("common.bit", package.seeall)
local bitLen = 32
local function numberToBits(src)
local result = {}
for i = 1, bitLen do
result[i] = src % 2
src = math.floor(src / 2)
end
return result
end
local function bitsToNumber(src)
local result = 0
for i = 1, bitLen do
if src[i] == 1 then
result = result + 2 ^ (i - 1)
end
end
return result
end
function SetBitLen(len)
bitLen = len
end
function GetBitLen(len)
return bitLen
end
function Lsl(src, dst)
return src * 2 ^ dst
end
function Lsr(src, dst)
return math.floor(src / 2 ^ dst)
end
function Xor(src, dst)
local srcBit = numberToBits(src)
local dstBit = numberToBits(dst)
local result = {}
for i = 1, bitLen do
result[i] = (srcBit[i] == dstBit[i] and 0 or 1)
end
return bitsToNumber(result)
end
function And(src, dst)
local srcBit = numberToBits(src)
local dstBit = numberToBits(dst)
local result = {}
for i = 1, bitLen do
result[i] = ((srcBit[i] == dstBit[i] and srcBit[i] == 1) and 1 or 0)
end
return bitsToNumber(result)
end
function Or(src, dst)
local srcBit = numberToBits(src)
local dstBit = numberToBits(dst)
local result = {}
for i = 1, bitLen do
result[i] = ((srcBit[i] == dstBit[i] and srcBit[i] == 0) and 0 or 1)
end
return bitsToNumber(result)
end
function Not(src)
local srcBit = numberToBits(src)
for i = 1, bitLen do
srcBit[i] = (srcBit[i] == 1 and 0 or 1 )
end
return bitsToNumber(srcBit)
end
function HexStringToNumber(hexString, isBigEndian)
local result = ""
if not isBigEndian then
local count = math.floor(string.len(hexString) / 2)
while count > 0 do
local index = count * 2 - 1
result = result .. string.sub(hexString, index, index + 1)
count = count - 1
end
else
result = hexString
end
return tonumber(result, 16)
end