目录
计算机中数字以二进制形式存储,在计算机运算的时候,是以补码形式来运算的。各个数之间的运算也是对它们的补码做运算,而且得到的结果也是补码。位运算也就是对二进制位进行操作。
利用位运算符快速计算
2的倍数
n << 1 求n * (2)
n << x 求n * (2 ** x)
n >>1 求n / (2)
n >> x 求n / (2 ** x)
快速交换
m ^= n
n ^= m
m ^= n
按位与 &
参与运算的两个值,如果两个值的对应位都是1,运算结果为1,否则为0.
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
00 00 01 01 -> 5
&
00 00 01 10 -> 6
---
00 00 01 00 -> 4
按位或 |
参与运算的两个值的对应位如果有1则为1,否则为0.
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
00 00 01 01 -> 5
|
00 00 01 10 -> 6
---
00 00 01 11 -> 7
按位异或 ^
参与运算的两值的二进制位相同为0,相异为1.
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
异或:取或再取反
00 00 01 01 -> 5
^
00 00 01 10 -> 6
---
00 00 00 11 -> 3
按位左移 <<
所运算数的二进位左移n位,高位丢弃,低位补0
x << n: 将x的二进制位向左移动n位。
n * (2 ** x)
00 00 10 11 -> 11
11 << 3
---
01 01 10 00 -> 88
按位右移 >>
所运算数的二进位右移n位。
x >> n: 将x的二进制位向右移动n位。
n / (2 ** x)
00 00 10 11 -> 11
11 >> 2
---
00 00 00 10 -> 2
按位取反 ~
参与运算的数对应的二进制位取反,1->0 ,0->1.
00 00 10 11 -> 11
11 ~ 2
---
00 00 10 11
11 11 01 00