2025-06-04 05:02:57 +08:00

167 lines
3.7 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

BitUtil = {}
BitUtil.data32= {}
for i=1,32 do
BitUtil.data32[i]=2^(32-i)
end
local int32= {}
for i=0,31 do
int32[i]=2^i
end
--num 10進位制的32位int, index 第幾位0-31
--返回num大於index位代表的值則為true反之為false
--ex: BitUtil.valid(128,5) 返回true BitUtil.valid(4,5) 返回false
function BitUtil.valid(num,index)
return num >= int32[index]
end
--num 10進位制的32位int, index 第幾位0-31
--返回若index位上有值則返回位相應的值否則返回0
function BitUtil.band(num,index)
--return bit.band(num,int32[index])
return num & int32[index]
end
--num 10進位制的32位int, index 第幾位0-31
--返回若index位上有值則返回1否則返回0
function BitUtil.bandOneZero(num,index)
--return bit.band(num,int32[index])>0 and 1 or 0
return (num & int32[index]) >0 and 1 or 0
end
--num 10進位制的32位int, index 第幾位0-31
--返回若index位上有值則返回位相應的值否則返回0
function BitUtil.bor(num,index)
--return bit.bor(num,int32[index])
return num | int32[index]
end
--num 10進位制的32位int, index 第幾位0-31
--返回位上設定1返回int
function BitUtil.setbit(num,index)
return BitUtil.band(num,index)>0 and num or num + int32[index]
end
--num 10進位制的32位int, index 第幾位0-31
--返回位上設定0返回int
function BitUtil.unsetbit(num,index)
return BitUtil.band(num,index)<=0 and num or num - int32[index]
end
--傳入一個32位整數
function BitUtil.d2b(arg)
arg = arg or 0
local bits ={}
for i=1,32 do
if arg >= BitUtil.data32[i] then
bits[i]=1
arg=arg-BitUtil.data32[i]
else
bits[i]=0
end
end
return bits
end
function BitUtil.b2d(arg)
local nr=0
for i=1,32 do
if arg[i] ==1 then
nr=nr+2^(32-i)
end
end
return nr
end
-- function BitUtil.xor(a,b)
-- local op1=BitUtil.d2b(a)
-- local op2=BitUtil.d2b(b)
-- local r={}
-- for i=1,32 do
-- if op1[i]==op2[i] then
-- r[i]=0
-- else
-- r[i]=1
-- end
-- end
-- return BitUtil.b2d(r)
-- end --bit:xor
-- function BitUtil.and(a,b)
-- local op1=BitUtil.d2b(a)
-- local op2=BitUtil.d2b(b)
-- local r={}
-- for i=1,32 do
-- if op1[i]==1 and op2[i]==1 then
-- r[i]=1
-- else
-- r[i]=0
-- end
-- end
-- return BitUtil.b2d(r)
-- end --bit:_and
-- function BitUtil.or(a,b)
-- local op1=BitUtil.d2b(a)
-- local op2=BitUtil.d2b(b)
-- local r={}
-- for i=1,32 do
-- if op1[i]==1 or op2[i]==1 then
-- r[i]=1
-- else
-- r[i]=0
-- end
-- end
-- return BitUtil.b2d(r)
-- end --bit:_or
-- function BitUtil._not(a)
-- local op1=BitUtil.d2b(a)
-- local r={}
-- for i=1,32 do
-- if op1[i]==1 then
-- r[i]=0
-- else
-- r[i]=1
-- end
-- end
-- return BitUtil.b2d(r)
-- end --bit:_not
-- function BitUtil.rshift(a,n)
-- local op1=BitUtil.d2b(a)
-- local r=BitUtil.d2b(0)
-- if n < 32 and n > 0 then
-- for i=1,n do
-- for i=31,1,-1 do
-- op1[i+1]=op1[i]
-- end
-- op1[1]=0
-- end
-- r=op1
-- end
-- return BitUtil.b2d(r)
-- end --bit:_rshift
function BitUtil.lshift(a,n)
local op1=BitUtil.d2b(a)
local r=BitUtil.d2b(0)
if n < 32 and n > 0 then
for i=1,n do
for i=1,31 do
op1[i]=op1[i+1]
end
op1[32]=0
end
r=op1
end
return BitUtil.b2d(r)
end --bit:_lshift