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

  • 相关阅读:
    数据仓库--事实表
    Oracle SQL函数pivot、unpivot转置函数实现行转列、列转行
    在Oracle中使用rank()over()排名的问题
    python 有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。(用列表推导式)
    pyhton 打印菱形
    三元运算
    Python代码书写规范
    DDT驱动
    使用 JsonPath 完成接口自动化测试中参数关联和数据验证(Python语言)
    数据类型(字典)
  • 原文地址:https://www.cnblogs.com/7qin/p/13511344.html
Copyright © 2011-2022 走看看