位运算
运算符 | 含义 | 实例 | 结果 |
---|---|---|---|
<< | 左移 | 4<<2 | 16 |
>> | 右移 | 4>>1 | 2 |
>>> | 无符号右移 | 4>>>1 | 2 |
& | 与 | 4&2 | 0 |
| | 或 | 4|2 | 6 |
^ | 异或 | 4^2 | 6 |
~ | 取反 | ~4 | -5 |
- &(与):两个二进制位只要有一个结果为0,那么结果就为0,否则结果为1。
- |(或):两个二进制位只要有一个结果为1,那么结果就为1,否则结果为0。
- ^(异或):任何相同二进制位进行 ^运算,结果是0,不相同二进制位进行运算。
- 运算结果是1.
- ~(取反):0变1,1变0.
- <<(左移):操作数<<位数,首先将左边的操作数转为二进制,然后按照要求左移指定位数,左边最高位丢弃,右边补齐0.
比如:
4<<2
4的二进制:00000000 00000000 00000000 00000100
左移两位:00000000 00000000 00000000 00010000
结果为:16
- >>(右移):首先将左边的操作数转为二进制,然后按照要求右移指定位数,最高位是0,左边补齐0,最高位是1,左边补齐1.
比如:
4>>1
4的二进制:00000000 00000000 00000000 00000100
右移一位:00000000 00000000 00000000 00000010
结果为:2
- ****>>>(无符号右移):首先将左边的操作数转为二进制,
然后按照要求右移指定位数,无论最高位是0还是1,左边补齐0.
比如:
4>>>1
4的二进制:00000000 00000000 00000000 00000100
无符号右移一位:00000000 00000000 00000000 00000010 //左边补0
结果为2
注意:
- 左移一位及左边的数乘以2的一次方,左移两位左边的数乘以2的二次方。。。以此类推。右移一位及左边的数除以2的一次方,右移两位左边的书除以2的二次方。。。以此类推。
- 负数右移先计算出补码(原码取反加1),补码右移相应位数,在将补码转换成原码(补码减1再取反)。
- 无符号数右移,统一在最高位补0.
位运算的应用
奇偶判断
思路:让被判断的数与1相&。得数为1则为奇数,得数为0则为偶数。
例:
- 6 & 1 = 0,即110 & 001 = 000, 6为偶数
- 7 & 1 = 1,即111 & 001 = 001, 7为奇数
两数交换
异或特点:一个数对自己异或一次,再异或另一个数,结果为另一个数。
分析理解:
- m=5 ,n=10
- m的二进制:00000000 00000000 00000000 00000101
- n的二进制:00000000 00000000 00000000 00001010
- m ^ m = 00000000 00000000 00000000 00000000
- m ^ m ^ n = 00000000 00000000 00000000 00001010 = n
例:
//交换m和n
int m=5;
int n=10;
System.out.println(m ^ m ^ n);//10
System.out.println(m ^ n ^ n);//5
//m = m ^ n;
//n = m ^ n; //5
//m = m ^ n; //10