热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

由于lua5.1不支持位操作,自己写了一个lua的位操作函数,代码如下:方法1:functionXor(num1,num2)localtmp1num1localtmp2num2lo

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


推荐阅读
author-avatar
zj
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有