美文网首页Lua
Lua bit库 & 位操作

Lua bit库 & 位操作

作者: binx6 | 来源:发表于2021-07-22 07:55 被阅读0次
-- bit库(默认32位)

bit={data32={}}

for i=1,32 do

    bit.data32[i]=2^(32-i)

end

function bit:d2b(arg)

    local  tr={}

    for i=1,32 do

        if arg >= self.data32[i] then

            tr[i]=1

            arg=arg-self.data32[i]

        else

            tr[i]=0

        end

    end

    return  tr

end  --bit:d2b

function    bit:b2d(arg)

    local  nr=0

    for i=1,32 do

        if arg[i] ==1 then

            nr=nr+2^(32-i)

        end

    end

    return  nr

end  --bit:b2d

function    bit:_xor(a,b)

    local  op1=self:d2b(a)

    local  op2=self:d2b(b)

    local  r={}

    for i=1,32 do

        if op1[i]==op2[i] then

            r[i]=0

        else

            r[i]=1

        end

    end

    return  self:b2d(r)

end --bit:xor

function    bit:_and(a,b)

    local  op1=self:d2b(a)

    local  op2=self:d2b(b)

    local  r={}

    for i=1,32 do

        if op1[i]==1 and op2[i]==1  then

            r[i]=1

        else

            r[i]=0

        end

    end

    return  self:b2d(r)

end --bit:_and

function    bit:_or(a,b)

    local  op1=self:d2b(a)

    local  op2=self:d2b(b)

    local  r={}

    for i=1,32 do

        if  op1[i]==1 or  op2[i]==1  then

            r[i]=1

        else

            r[i]=0

        end

    end

    return  self:b2d(r)

end --bit:_or

function    bit:_not(a)

    local  op1=self:d2b(a)

    local  r={}

    for i=1,32 do

        if  op1[i]==1  then

            r[i]=0

        else

            r[i]=1

        end

    end

    return  self:b2d(r)

end --bit:_not

function    bit:_rshift(a,n)

    local  op1=self:d2b(a)

    local  r=self:d2b(0)

    if n < 32 and n > 0 then

        for i=1,n do

            for i=31,1,-1 do

                op1[i+1]=op1[i]

            end

            op1[1]=0

        end

        r=op1

    end

    return  self:b2d(r)

end --bit:_rshift

function    bit:_lshift(a,n)

    local  op1=self:d2b(a)

    local  r=self:d2b(0)

    if n < 32 and n > 0 then

        for i=1,n  do

            for i=1,31 do

                op1[i]=op1[i+1]

            end

            op1[32]=0

        end

        r=op1

    end

    return  self:b2d(r)

end --bit:_lshift

function    bit:print(ta)

    local  sr=""

    for i=1,32 do

        sr=sr..ta[i]

    end

    print(sr)

end

位操作

bit = bit or {}

    bit.data32 = {}

   

    for i=1,32 do

        bit.data32[i]=2^(32-i)

    end

   

    function bit._b2d(arg)

        local nr=0

        for i=1,32 do

            if arg[i] ==1 then

                nr=nr+bit.data32[i]

            end

        end

        return  nr

    end

   

    function bit._d2b(arg)

        arg = arg >= 0 and arg or (0xFFFFFFFF + arg + 1)

        local tr={}

        for i=1,32 do

            if arg >= bit.data32[i] then

                tr[i]=1

                arg=arg-bit.data32[i]

            else

                tr[i]=0

            end

        end

        return  tr

    end

   

    function    bit._and(a,b)

        local op1=bit._d2b(a)

        local op2=bit._d2b(b)

        local r={}

   

        for i=1,32 do

            if op1[i]==1 and op2[i]==1  then

                r[i]=1

            else

                r[i]=0

            end

        end

        return  bit._b2d(r)

   

    end

   

    function    bit._rshift(a,n)

        local op1=bit._d2b(a)

        n = n <= 32 and n or 32

        n = n >= 0 and n or 0

   

        for i=32, n+1, -1 do

            op1[i] = op1[i-n]

        end

        for i=1, n do

            op1[i] = 0

        end

   

        return  bit._b2d(op1)

    end

   

    function bit._not(a)

        local op1=bit._d2b(a)

        local r={}

   

        for i=1,32 do

            if  op1[i]==1  then

                r[i]=0

            else

                r[i]=1

            end

        end

        return bit._b2d(r)

    end

   

    function bit._or(a,b)

        local op1=bit._d2b(a)

        local op2=bit._d2b(b)

        local r={}

   

        for i=1,32 do

            if op1[i]==1 or op2[i]==1  then

                r[i]=1

            else

                r[i]=0

            end

        end

        return bit._b2d(r)

    end

    local a = 7

    local b = bit._d2b(a)

    for k,v in pairs(b) do

    print(k,v)

    end

   

    print(bit._b2d(b))

相关文章

  • Lua bit库 & 位操作

    -- bit库(默认32位) bit={data32={}} for i=1,32 do bit.data32...

  • 改进nixio

    lua 5.1 for windows系统提供的io库,并不支持64位操作。听说lua 5.2已经修复过了Stac...

  • bit位操作

    https://catonmat.net/low-level-bit-hacks

  • 第七章 操作位和位串(三)

    第七章 操作位和位串(三) 操作位串 要创建新的位串,请使用 $bit 函数将所需位设置为 1: 使用 $bit ...

  • Bit Manipulation Summary

    来总结一下Bit Manipulation的一些常见操作: 将第n位bit 设为1: 将第n位bit 设为0: 将...

  • 高效bit 位经典操作

    奇偶判断只需要判断数字的最后一个比特位是0 还是 1, 只要最后一位为0 都可以表示成 x*2 即 x<<1bo...

  • nginx(openrestry)实现动态负载均衡

    nginx配置 lua文件 相关Lua库 json解析库:https://github.com/mpx/lua-c...

  • Lua 数据库访问

    本文主要为大家介绍 Lua 数据库的操作库:LuaSQL。他是开源的,支持的数据库有:ODBC, ADO, Ora...

  • Lua与C交互简介

    Lua资源获取### Lua各个平台动态库与静态库下载地址Lua源码下载地址 交互原理#### 要理解Lua与C的...

  • No41.浮点数近似规则

    名词 保留位(Guard bit)、近似位(Round bit)和粘滞位(Sticky bit)。保留位:近似后的...

网友评论

    本文标题:Lua bit库 & 位操作

    本文链接:https://www.haomeiwen.com/subject/wzhemltx.html