位运算技巧
异或实现的交换数
通常的交换两个变量a,b的过程为
1 | int temp; |
需借助上面的第3个临时变量temp.
采用下面的方法,对于给定两个整数a,b,下面的异或运算可以实现a,b的交换,而无需借助第3个临时变量:
1 | a = a ^ b; |
这个交换两个变量而无需借助第3个临时变量过程,其实现主要是基于异或运算的如下性质:
- 任意一个变量X与其自身进行异或运算,结果为0,即
X^X=0
- 任意一个变量X与0进行异或运算,结果不变,即
X^0=X
- 异或运算具有可结合性,即
a^b^c=(a^b)^c=a^(b^c)
- 异或运算具有可交换性,即
a^b=b^a
某些缓存文件可以通过异或来简单加密,特征文件大小不变
对2的幂快速取余
1 | m % 2^n <=> m & (2^n - 1) |
快速判断属性的存在
借鉴了 bitmap 思想,把某个属性的开启和关闭映射到2进制位的0,1
令 0x01,0x02,0x04,0x08 表示a,b,c,d属性的开启,0x00 表示关闭:
- 总的配置为 option = option_a|option_b|option_c|option_d
- 判断属性的存在 option & option_a = option_a