Cocos2D lua库函数剖析(一)bitExtend 位运算相关

项目中用到了Cocos2d,接触了几天,发现Cocos2d对于2D游戏来讲开发效率蛮高的,近来学习一下库函数,Mark一下。这个系列应该会持续更新,欢迎多多关注,(*^__^*) 嘻嘻……

下面贴上源代码以及一些简单的注释

-- bit operation

bit = bit or {}   --避免为空时报错
bit.data32 = {}   --32位

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)      --and   or 类似于C++ 中的  A = B ? C : D
    local tr={}                                           --0xFFFFFFF相当于二进制的11111111 1111111 11111111 11111111
    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

bit.band   = bit.band or bit._and
bit.rshift = bit.rshift or bit._rshift
bit.bnot   = bit.bnot or bit._not

关于位运算的应用场景,整理了一下,大致如下

1.交换两个整数的值而不必用第三个参数

2.奇偶判断

3.格雷码

4.次幂,具体的详细内容如果想了解可以自行搜索

下面是一些链接,有兴趣的可以看看

https://blog.csdn.net/limanjihe/article/details/52382826

https://blog.csdn.net/alps1992/article/details/42131581

猜你喜欢

转载自blog.csdn.net/qq_39218906/article/details/94723397
今日推荐