在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
由于lua5.1不支持位操作,自己写了一个lua的位操作函数,代码如下: 方法1: function Xor(num1,num2) local tmp1 = num1 local tmp2 = num2 local str = "" repeat local s1 = tmp1 % 2 local s2 = tmp2 % 2 if s1 == s2 then str = "0"..str else str = "1"..str end tmp1 = math.modf(tmp1/2) tmp2 = math.modf(tmp2/2) until(tmp1 == 0 and tmp2 == 0) return tonumber(str,2) end function And(num1,num2) local tmp1 = num1 local tmp2 = num2 local str = "" repeat local s1 = tmp1 % 2 local s2 = tmp2 % 2 if s1 == s2 then if s1 == 1 then str = "1"..str else str = "0"..str end else str = "0"..str end tmp1 = math.modf(tmp1/2) tmp2 = math.modf(tmp2/2) until(tmp1 == 0 and tmp2 == 0) return tonumber(str,2) end function Or(num1,num2) local tmp1 = num1 local tmp2 = num2 local str = "" repeat local s1 = tmp1 % 2 local s2 = tmp2 % 2 if s1 == s2 then if s1 == 0 then str = "0"..str else str = "1"..str end else str = "1"..str end tmp1 = math.modf(tmp1/2) tmp2 = math.modf(tmp2/2) until(tmp1 == 0 and tmp2 == 0) return tonumber(str,2) end 使用方法如下: local tmp1 = 0x52 local tmp2 = 0x01 print(Xor(tmp1,tmp2)) --输出tmp1 异或 tmp2 的操作结果 print(And(tmp1,tmp2)) --输出tmp1 与 tmp2 的操作结果 print(Or(tmp1,tmp2)) --输出tmp1 或 tmp2 的操作结果
加入支持负数的位运算操作: 但是负数和负数位操作出来的显示是个整数 如 And(-8,-5) 结果 :4294967288 在32位机器上就是 -8 function checkNums( nums ) local n = nums if n >= 0 then return n else n = 0 - n n = 0xffffffff - n + 1 end return n end function resultCover( n ) local num = n if num >= 0x80000000 then num = num - 0xffffffff - 1 end return num end function And(num1,num2) local tmp1 = checkNums(num1) local tmp2 = checkNums(num2) local ret = 0 local count = 0 repeat local s1 = tmp1 % 2 local s2 = tmp2 % 2 if s1 == s2 and s1 == 1 then ret = ret + 2^count end tmp1 = math.modf(tmp1/2) tmp2 = math.modf(tmp2/2) count = count + 1 until(tmp1 == 0 and tmp2 == 0) return resultCover(ret) end function Or(num1,num2) local tmp1 = checkNums(num1) local tmp2 = checkNums(num2) local ret = 0 local count = 0 repeat local s1 = tmp1 % 2 local s2 = tmp2 % 2 if s1 == s2 and s1 == 0 then else ret = ret + 2^count end tmp1 = math.modf(tmp1/2) tmp2 = math.modf(tmp2/2) count = count + 1 until(tmp1 == 0 and tmp2 == 0) return resultCover(ret) end function Xor(num1,num2) local tmp1 = checkNums(num1) local tmp2 = checkNums(num2) local ret = 0 local count = 0 repeat local s1 = tmp1 % 2 local s2 = tmp2 % 2 if s1 ~= s2 then ret = ret + 2^count end tmp1 = math.modf(tmp1/2) tmp2 = math.modf(tmp2/2) count = count + 1 until(tmp1 == 0 and tmp2 == 0) return resultCover(ret) end 5.3开始自带位操作: & 按位与 | 按位或 ~ 按位异或 >> 右移 << 左移 ~ 按位非 使用方法: c = a & b c = a | b c = a ~ b c = a >> b c = a << b c = ~a https://blog.csdn.net/u013625451/article/details/84644839 |
请发表评论