位运算
程序中的所有数在计算机内存中都是以二进制的形式储存的。
位运算就是直接对整数在内存中的二进制位进行操作。因此位运算的执行效率非常高,在程序中尽量使用位运算进行操作,这会大大提高程序的性能。
按位与 &
相同位的两个数字都为 1 时,则为 1 ;否则为 0 。例如:
1 0 0 1 1
&
1 1 0 0 1
结果为
1 0 0 0 1
按位或 |
相同位的两个数字都为 0 时,则为 0 ;否则为 1 。例如:
1 0 0 1 1
|
1 1 0 0 1
结果为
1 1 0 1 1
按位异或 ^
相同位的两个数字相同时,则为 0 ;否则为 1 。例如:
1 0 0 1 1
^
1 1 0 0 1
结果为
0 1 0 1 0
按位取反 ~
对所有位取反,即将 0 变为 1 ,将 1 变为 0 。例如:
~ 1 0 0 1 1
结果为
0 1 1 0 0
左移 <<
向左进行移位操作,高位丢弃,低位补 0 (左移多少位,就在二进制数后面添加多少个 0 )。例如:
int a = 9;
a << 3;
移位前:0000 0000 0000 0000 0000 0000 0000 1001
移位后:0000 0000 0000 0000 0000 0000 0100 1000
可以看出:
移位后 a 的十进制数由 9 变为了 72,也就是 9 * (2 ^ 3) 。
即 a << b 等价于 a * (2 ^ b) 。
因为在二进制数后添一个 0 就相当于该十进制数乘以 2 。
右移 >>
向右进行移位操作,低位丢弃,高位补 0 (右移多少位,就从二进制数末尾开始去掉多少位)。例如:
int a = 72;
a >> 3;
移位前:0000 0000 0000 0000 0000 0000 0100 1000
移位后:0000 0000 0000 0000 0000 0000 0000 1001
可以看出:
移位后 a 的十进制数由 72 变为了9,也就是 72 / (2 ^ 3) 。
即 a >> b 等价于 a / (2 ^ b) 取整
因为二进制数每丢弃一位,就相当于该十进制数除以 2 。
参考:七分钟全面了解位运算