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

  • 相关阅读:
    java 的 线程池应用和实践
    拦截信息短信息并转发到指定手机
    分享 UC优视 的android程序员面试题
    解释通讯协议中的xml
    设计模式工厂模式
    MongoDB基础教程系列第一篇 进入MongoDB世界
    Docx组件读写Word文档介绍
    [转]Oracle数据库逻辑增量备份之exp/imp
    JSON文件读取
    JAVA综合--如何掌握JDK1.5枚举类型[转]
  • 原文地址:https://www.cnblogs.com/7qin/p/13511344.html
Copyright © 2011-2022 走看看