位运算

位操作是程序设计中对位模式按位或二进制数的一元和二元操作. 在许多古老的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多. 在现代架构中, 情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算). –维基百科

取反(NOT)

取反是一元运算符, 对一个二进制数的每一位执行逻辑反操作. 使数字1成为0, 0成为1. 例如:

1
2
NOT 0111 (十进制 7)
= 1000 (十进制 8)

按位与(AND)

按位与处理两个长度相同的二进制数, 两个相应的二进位都为1, 该位的结果值才为1,否则为0. 例如:

1
2
3
    0101
AND 0011
= 0001

常见的应用:

用于判断当前数的奇、偶性。例如判断a是否为奇数。

a AND 1 的值为1的时候代表a是奇数,值为0的时候代表a是偶数。

因为如果a是奇数的时候末位值肯定为1,AND 1的时候还是1,前面的位与0 AND 的时候,肯定为0。

给定一个参数a(16位),可以截取到第n位。

1
2
3
 10010000 00100000
AND 00000000 11111111
= 00000000 00100000

上面的例子就是截取到第8位,前面的值可以即为清零,后面的值不会变。

按位或(OR)

按位或处理两个长度相同的二进制数, 两个相应的二进位中只要有一个为1, 该位的结果值为1. 例如

1
2
3
   0101 (十进制 5)
OR 0011 (十进制 3)
= 0111 (十进制 7)

按位异或(XOR)

按位异或运算, 对等长二进制模式按位或二进制数的每一位执行逻辑异按位或操作. 操作的结果是如果某位不同则该位为1, 否则该位为0. 例如

1
2
3
    0010
XOR 1010
= 1000

常见用于简单的加密过程: 异或运算的逆运算是它本身,也就是说两次异或同一个数,最后结果不变。

1
2
3
4
5
6
7
    0010
XOR 1010
= 1000

1000
XOR 1010
= 0010

此时就有了一个诡异的swap过程。

1
2
3
4
5
int a = 5;
int b = 4;
a = a ^ b;(第一步把a赋值成a,b的异或值)
b = a ^ b;(然后,b赋值成a^b即(5^4^4),把a的值赋值给了b)
a = a ^ b;(最后,a赋值成a^b即(5^4^5),把b的值赋值给了a)

—EOF—