Lua

Lua bit库 & 位操作

2021-07-22  本文已影响0人  binx6
-- 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))

上一篇 下一篇

猜你喜欢

热点阅读