Lua 5.1 位操作(与,或,异或操作)

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

posted @ 2020-08-16 02:53  笠航  阅读(4659)  评论(0编辑  收藏  举报