您的位置:首页 > 编程语言 > Lua

lua 中的 bit extend 库 (可能仅对非负数有效)

2015-06-09 01:06 459 查看
-- bit operation

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._xor(a,b)

    local op1 = bit._d2b(a)

    local op2 = bit._d2b(b)

    local r={}

    for i = 1,32 do

        if op1[i] == 0 then

            r[i] = op2[i]

        else

            if op2[i] == 0 then

                r[i] = 1

            else

                r[i] = 0

            end

        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._lshift(a,n)

    local op1 =bit._d2b(a)

    n = n <= 32 and n or 32

    n = n >= 0 and n or 0

    for i = 1, 32 - n do

        op1[i] = op1[i + n]

    end

    for i = 32 - n + 1, 32 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

bit.band   = bit.band or bit._and

bit.rshift = bit.rshift or bit._rshift

bit.bnot   = bit.bnot or bit._not

bit.lshift = bit.lshift or bit._lshift

bit.xor = bit.xor or bit._xor
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: