1、位运算符号
&
|
^
‘~’ 取反,不分正负数
‘<<’ 标准规定在右边补 0
‘>>’ 正数则左边补 0 负数标准没有规定在左边补充的数字,分为逻辑右移和算术右移,具体由编译器决定,windows 平台和 gcc 采取算术右移即负数补 1
2、常见的二进制位的变换操作
去掉最后一位 | (101101->10110)
101101 —> 10110
x >> 1
在最后加一个0 | (101101->1011010) |
101101 —> 1011010
x << 1
在最后加一个1 | (101101->1011011) |
101101 —> 1011010 —> 1011010 | 0000001 —>1011011
(x << 1)|1
把最后一位变成1 | (101100->101101) |
101100 —> 101100 | 000001 —> 101101
x | 1
把最后一位变成0 | (101101->101100) | (x | 1)-1或者
101101 —> 101100 | 000001 —> 101101 —> 101101 -1 —> 101100
(x | 1)-1
最后一位取反 | (101101->101100) |
101101 —> 101101 ^ 000001 —> 101100
x ^ 1
把右数第 k 位变成 1 | (101001->101101,k=3) |
000001 —> 000100
101001 | 000100 —> 101101
x | (1 << (k-1))
把右数第 k 位变成 0 | (101101->101001,k=3) |
000001 —> 000100 —> 111011
111011 & 101101 —> 101001
x & ~(1 << (k-1))
右数第 k 位取反 | (101001->101101,k=3) | x ^ (1 << (k-1))
000001 —> 000100
101001 ^ 000100 —> 101101
x ^ (1 << (k-1))
取末三位 | (1101101->101) |
1101101 & 111 —> 101
x & 7
取末 k 位 | (1101101->1101,k=4) |
1 —> 10000 —> 1111
1101101 & 1111 —> 1101
x & ((1 << k)-1)
取右数第 k 位 | (1101101->1,k=4) |
1101101 —> 0001101
0001101 & 1 —> 1
(x >> (k-1)) & 1
把右边连续的 1 变成 0 | (100101111->100100000) |
100101111 —> 100110000
100101111 & 100110000 —> 100100000
x & (x+1)
把右起第一个 0 变成 1 | (100101111->100111111) |
100101111 —> 100110000
100101111 | 100110000 —> 100111111
x | (x+1)
把右边连续的 0 变成 1 | (11011000->11011111) |
11011000 —> 11010111
11010111 | 11011000 —> 11011111
x | (x-1)