代码里偶尔会看到一些位操作运算,有些不熟,看起来有点费解,下面做些梳理,便于记忆回顾。
一、与操作
与操作的特点就是只有都为1,结果才为1,其他情况都是0
常用的实现就是用来判断某个位是否置为1
x & (1 « n) == 宏定义
或者(x » n) & 1 == 1
还有用来将某一位置0
x & (~(1 « n))
其他一些实现操作:
1、判断奇偶性(也就是上面讲的只判断最后一位是否为1)
x & 1
只要是偶数,结果就是0;如果是奇数,结果就是1
2、清除二进制最后一个1(该特性可以用来计算一个二进制数有多少个1)
x & (x-1)
3、获得二进制最后一个1
x & -x
4、判断x是否是y的整数倍
x == x & ~(y-1)
如果相等就说明x是y的整数倍,如果想将x做y的整数倍向上补齐,则可以使用如下表达式
(x+y) & ~(y-1)
这个在AES计算时比较常见
5、将右边的n位清零,在网段计算中有使用到
x & (~0 « n)
6、保留右边的n位,将前面的数都清零
x & ((1 « n) - 1)
二、或操作
或操作的特点就是只要操作的一方是1,结果就是1
常用实现就是将某一位置1
比如一个整数32位,每一位分别代表一个功能标记,如果支持,就将对应的位置1
x | (1 « n)
三、异或操作
异或操作的特点是两个数相同是0,不同是1
常见实现操作
1、x ^ x = 0 ; x ^ 0 = x
2、x ^ y = z; z ^ x = y; z ^ y = x (通过位操作来实现两个数交换)
3、x ^ ~(0) = ~x ; x ^ ~x = ~(0)
上面三个看着有个规律就是一个数与另一个数进行异或操作的结果,其结果和前面其中一个数进行异或操作会得到另一个数