位运算
位运算符 | 含义 |
---|---|
& | 与 |
| | 或 |
~ | 非 |
^ | 异或 |
<< | 左移 |
>> | 右移 |
按位运算
按位与 &
01011010 & 11110101 = 01010000
常用应用:
-
让某一位或者某些位为0
- 11111110 & xxxxxxxx , 让前七位原封不动,最后一位无论是1还是0都变成0
-
取一个数中的一段
- 00011000 & xxxxxxxx, 只要中间两个数,其余数变成0
按位或 |
01011010 & 01010101 = 01011111
常用应用:
- 让某一位或者某些位为0
- 00000001 | xxxxxxxx , 让前七位原封不动,最后一位无论是1还是0都变成1
- 将两个数拼起来
- 如: 11000011 | 00111100 = 11111111
按位取反 ~
~ 00001111 = 11110000
按位异或 ^
10101100 ^ 01011100 = 00001111
-
如果两个相等的数进行异或运算,结果为0
-
对于同一值异或两次,原数值不变
按位异或有一个应用,可以不创建第三个变量来交换两个变量的值:
int a = 1;
int b = 2;
// a => 1; b => 2;
a = a^b;
b = a^b;
a = a^b;
// a -> 2; b => 1;
位移运算
左移 <<
- i << j
- i中所有的位向左移动j位,右边填0
- 所有小于int的类型,位移以int的方式来做
x <<= 1
<==>x *= 2
x <<= n
<==>x *= pow(2,n)
- 上面这两点可以用二进制的按权展开来理解
右移 >>
- i >> j
- i中所有的位向右移动j位
- 所有小于int的类型,位移以int的方式来做
- 对于unsigned类型,左边填0
- 对于sign类型,由于最左边的那一位是符号位,因此符号位不变
x >>= 1
<==>x *= 1/2
x >>= n
<==>x *= 1/pow(2,n)
- 上面这两点可以用二进制的按权展开来理解