• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Lua5.1位操作(与,或,异或操作)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

由于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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
OpenResty:通过 Lua 扩展 NGINX 实现的可伸缩的 Web 平台发布时间:2022-07-22
下一篇:
lua转换16进制字符串为10进制数值发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap