位运算基本知识
符号 | 描述 | 运算规则 |
& | 与 | 两个位都为1时,结果才为1 |
| | 或 | 两个位都为0时,结果才为0 |
^ | 异或 | 两个位相同为0,相异为1 |
~ | 取反 | 0变1,1变0 |
<< | 左移 |
各二进位全部左移若干位,高位丢弃,低位补0 |
>> | 右移 |
各二进位全部右移若干位,对无符号数,高位补0, 有符号数,各编译器处理方法不一样,有的补符号位 (算术右移),有的补0(逻辑右移) |
无符号右移 |
各二进位全部右移若干位,高位补0,低位丢弃 |
1、<< 左移
两个左尖括号表示左移运算符,运算符规则是:各二进位全部左移若干位,高位丢弃,低位补0。
例如:6 << 2 = 24 0000 0000 0000 0000 0000 0000 0000 0110 -> 6 0000 0000 0000 0000 0000 0000 0001 1000 -> 6 << 2 = 24
我们将6的二进位向左移动两位,低位补上两个0,高位丢弃,得出来的结果就是24。
左移常被用来做 * (2 ^ n)的运算,因为直接基于二进制运算,所以左移效率比 * (2 ^ n)高。
2、>> 右移
两个右尖括号表示右移运算符,运算符规则是:各二进位全部右移若干位,正数高位补0,负数高位补1,低位丢弃。
例如: 12 >> 2 = 3 0000 0000 0000 0000 0000 0000 0000 1100 -> 12 0000 0000 0000 0000 0000 0000 0000 0011 -> 12 >> 2 = 3
因为12是正数,右移过程中高位补上两个0,低位丢弃,得出来的结果就是3。
例如:-12 >> 2 = -3
1111 1111 1111 1111 1111 1111 1111 0100 -> -12 1111 1111 1111 1111 1111 1111 1111 1101 -> -12 >> 2 = -3
因为-12是负数,右移过程中高位补上两个1,低位丢弃,得出来的结果就是-3。
右移常被用来做 / (2 ^ n)的运算,因为直接基于二进制运算,所以右移效率比 / (2 ^ n)高。
3、>>> 无符号右移
三个右尖括号表示无符号右移运算符,运算符规则是:各二进位全部右移若干位,高位补0,低位丢弃。
例如: 12 >>> 2 = 3 0000 0000 0000 0000 0000 0000 0000 1100 -> 12 0000 0000 0000 0000 0000 0000 0000 0011 -> 12 >>> 2 = 3
我们将12的二进位向右移动两位,高位补上两个0,低位丢弃,得出来的结果就是3。
例如:-12 >>> 2 = 1073741821 1111 1111 1111 1111 1111 1111 1111 0100 -> -12 0011 1111 1111 1111 1111 1111 1111 1101 -> -12 >> 2 = 1073741821
我们将-12的二进位向右移动两位,高位补上两个0,低位丢弃,得出来的结果就是1073741821。
位运算的常见技巧
位运算实现乘法:数 a 向右移一位,相当于将 a 除以 2;数 a 向左移一位,相当于将 a 乘以 2
位运算判断奇偶数:只要根据数的最后一位是 0 还是 1 来决定即可,为 0 就是偶数,为 1 就是奇数。
用于交换两个数:a ^ b ^ b = a
n&(n-1):相当于把n最右边的1变成0,其余不变
位运算实际运用的例子:
位交换两个数:a ^ b ^ b = a