lua位操作(感觉这效率较低)

来源:互联网 发布:网络远程教育报名 编辑:程序博客网 时间:2024/06/07 03:24
--[[Description:    FileName:bit.lua    This module provides a selection of bitwise operations.History:    Initial version created by  阵雨 2005-11-10.Notes:  ....]]--[[{2147483648,1073741824,536870912,268435456,134217728,67108864,33554432,16777216,        8388608,4194304,2097152,1048576,524288,262144,131072,65536,        32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1}        ]]bit={data32={}}for i=1,32 do    bit.data32[i]=2^(32-i)endfunction 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   trend   --bit:d2bfunction    bit:b2d(arg)    local   nr=0    for i=1,32 do        if arg[i] ==1 then        nr=nr+2^(32-i)        end    end    return  nrend   --bit:b2dfunction    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:xorfunction    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:_andfunction    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:_orfunction    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:_notfunction    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:_rshiftfunction    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:_lshiftfunction    bit:print(ta)    local   sr=""    for i=1,32 do        sr=sr..ta[i]    end    print(sr)endbs=bit:d2b(7)bit:print(bs)-->00000000000000000000000000000111bit:print(bit:d2b(bit:_not(7)))-->11111111111111111111111111111000bit:print(bit:d2b(bit:_rshift(7,2)))-->00000000000000000000000000000001bit:print(bit:d2b(bit:_lshift(7,2)))-->00000000000000000000000000011100print(bit:b2d(bs))                      -->     7print(bit:_xor(7,2))                    -->     5print(bit:_and(7,4))                    -->     4print(bit:_or(5,2))                     -->     7--end of bit.lua

0 0
原创粉丝点击