位运算应用例子

来源:互联网 发布:linux rar文件不能解压 编辑:程序博客网 时间:2024/05/21 23:32

1.  两个数交换

local a = 2  

local b = 4

--------异或

a = bit.bxor(a,b)

b = bit.bxor(b,a)

a = bit.bxor(a,b)

2.比较大小


function VipRoomLayer:cmpshirt(n)

local _a = n
_a = bit.bor(_a,bit.brshift(_a,1)) 
_a = bit.bor(_a,bit.brshift(_a,4)) 
_a = bit.bor(_a,bit.brshift(_a,8)) 
_a = bit.bor(_a,bit.brshift(_a,16)) 
return _a

end


function VipRoomLayer:cmp(n , m)
print("bit.bxor(n,m)",bit.bxor(n,m))
local a = bit.band(n,bit.bxor(n,m)) -- 0
local b = bit.band(m,bit.bxor(n,m)) -- 1
-------右移
a = self:cmpshirt(a) --第一个不同的位后的首个‘1’开始,将右边的位全置
b = self:cmpshirt(b)
print(string.format("a = %d  b = %d",a,b))
-- bit.band  bit.bxor  bit.brshift  bit.bor  bit.band bit.bxor  

do
--把a中自首个不相同的位起,之后的位全清零  
a = bit.band(a,bit.brshift(bit.bxor(a,b),1)) 
a = bit.band(a,bit.bxor(bit.bxor(a,b),bit.brshift(bit.bxor(a,b),1)))
a = bit.band(b,(bit.bxor(a,b)))
a = bit.bor(bit.band(bit.brshift(b,31),1),a)  -- 把b的符号位加到a的最低位
a = bit.band(a,2147483647)  --清除a的符号位
end
print("a 的值是,b是",n,m)
print("大小是 a > b ",(a == 0 and  '相等' or not(a > 0) and true or false))

end


3.bit.band

判断奇偶(按位与)

一个数 and 1 如果末位是1 则为奇数 如

9 --------0000 1001

9 and 1 

0000 1001

0000 0001

=========

0000 0001 

4.判断该数是否为2的次幂

n = 4

n_ - 1 = 3

bit.band(bit.band(n,n -1) ,n) 如果结果为0的话就是2的n次幂

按位与计算

4----------0000 0101

3----------0000 0100

4 and 3

0000 0101

0000 0100

=============

0000 00000





0 0