zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    SQL Server如何固定执行计划
    领导修炼
    content management system
    npm和bower
    web开发workflow
    偏执狂
    website project team member 角色及开发过程概念图
    website architecture
    王道霸道
    design pattern及其使用
  • 原文地址:https://www.cnblogs.com/7qin/p/13511344.html
Copyright © 2011-2022 走看看