看Matrix67的位运算系列博客,整理一下。
位运算符只能用于整型数据。
!!!位运算符的优先级比较低,因此应尽量使用括号来保证运算顺序!!!
C符号 | 含义 | 应用 | 运算规则 |
---|---|---|---|
& | and | 取位 | |
or | 无条件赋值 | ||
^ | xor | 特定位取反 | 是不是不一样 |
~ | not | 每位取反 not a <=> -a-1 | |
<< | shl | a << b <=> a x 2^b | 左移b位,后面添b个0 |
shr | a >> b <=> a / 2^b【取整】 | 去掉末尾b位之后,对于无符号数,左边添b个0,对于有符号数,左边复制b个符号位 |
常见的二进制位的变换操作
功能 | 示例 | 位运算 |
---|---|---|
把最后一位变成0 | 101101->101100 | x or 1-1 |
最后一位取反 | 101101->101100 | x xor 1 |
把右数第k位变成1 | 101001->101101,k=3 | x or (1 shl (k-1)) |
取右数第k位 | 1101101->1,k=4 | x shr (k-1) and 1 |
取末k位 | 1101101->1101,k=4 | x and ((1 shl k) - 1) |
把右边连续的1变成0 | 100101111->100100000 | x and (x+1) |
把右起第一个0变成1 | 100101111->100111111 | x or (x+1) |
把右边连续的0变成1 | 11011000->11011111 | x or (x-1) |
取右边连续的1 | 100101111->1111 | (x xor (x+1)) shr 1 |
去掉右起第一个1的左边 | 100101000->1000 | x and (x xor (x-1)) |