位运算整理
优先级
运算符 | 含义 | 使用形式 | 结合方向 | 说明 | 优先级 |
---|---|---|---|---|---|
~ | 按位取反 | flags = ~flags; | 右到左 | 单目 | 3 |
<< | 左移 | int flags = 33 << 1; | 左到右 | 双目 | 7 |
>> | 右移 | int flags = 33 >> 1; | 左到右 | 双目 | 7 |
& | 按位与 | flags = flags & 42; | 左到右 | bitand | 10 |
^ | 按位异或 | flags = flags ^ 42; | 左到右 | xor | 11 |
| | 按位或 | flags = flags | 42; | 左到右 | bitor |
左移
左移n位就是乘以2的n次方。
功能:把"<<“左边的运算数的各二进位全部左移若干位,由”<<"右边的数指定移动的位数,高位丢弃,低位补0
右移
快速除
右移n位就是除以2的n次方
功能:把">>“左边的运算数的各二进位全部右移若干位,”>>"右边的数指定移动的位数。
说明:对于有符号数,在右移时,符号位将随同移动。
当为正数时, 最高位补0,而为负数时,符号位为1。
最高位是补0或是补1 取决于编译系统的规定。
对于有符号整数来说,比如int类型,右移会保持符号位不变。
按位与
应用:
判断int型变量a是奇数还是偶数:a&1=0 偶数, a&1 = 1 奇数
应用
- 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a >> k & 1
- 将int型变量a的第k位清0,即a = a &~ (1 << k)
- 将int型变量a的第k位置1, 即a = a | (1<<k)
- int型变量循环左移k次,即a = a << k | a >> 16 - k (设sizeof(int) = 16)
- int型变量a循环右移k次,即a = a >> k |a << 16-k (设sizeof(int) = 16)
注意事项
位运算是对字节或字中的实际二进制位进行检测、设置或移位,只适用于字符型和整数型变量以及它们的变体,对其它数据类型不适用。