Lua位运算
Lua位运算的实现,用库感觉还是太麻烦,还是自己实现下吧,因为lua中没办法整除,但是毕竟是除2,直接把小数点抹去就可以了,循环拿商除2,每次循环位置+1(乘2),余数就是位上的数,对单独的位进行运算后乘上位移。
local BitMath = {} local function _and(n1, n2) return n1 == 1 and n2 == 1 and 1 or 0 end local function _or(n1, n2) return (n1 == 1 or n2 == 1) and 1 or 0 end local function _xor(n1, n2) return n1 + n2 == 1 and 1 or 0 end local function _opr(n1, n2, action) if n1 < n2 then n2, n1 = n1, n2 end local rst = 0 local shift = 1 while n1 ~= 0 do local ra = n1 % 2 local rb = n2 % 2 rst = rst + shift * action(ra, rb) n1 = math.floor(n1 / 2) n2 = math.floor(n2 / 2) shift = shift * 2 end return rst end function BitMath.And(n1, n2) return _opr(n1, n2, _and) end function BitMath.Or(n1, n2) return _opr(n1, n2, _or) end function BitMath.Xor(n1, n2) return _opr(n1, n2, _xor) end function BitMath.Not(num) return num > 0 and -(num + 1) or -num - 1 end function BitMath.LShift(num, shift) return num * (2 ^ shift) end function BitMath.RShift(num, shift) return math.floor(num / (2 ^ num)) end return BitMath
枚举中的Flag
enum其实就只是个普通的数值,这个方法也就是传入两个数,判断flag长度在enum内二进制位是0还是1.
function Enum.HasFlag(enum, flag) local bitPos = 0 while flag ~= 0 do flag = math.floor(flag / 2) if flag ~= 0 then --最后为0时不增加位置 bitPos = bitPos + 1 end end for i = 1, bitPos do enum = math.floor(enum / 2) end local enummod = enum % 2 if enummod == 1 then return true else return false end end
文章评论