PS: 理解下文我所举的例子需要了解补码、原码与反码,如果不了解,可以先去看我的另一篇博文————数字类型在JVM(Java虚拟机)中的表示
&:按位与
当两个操作数皆为1时,值为1,否则值结果0
例:假使
byte x=8,y=10;
byte z=x&y;
分别计算出x与y的补码(正数的补码是该数的二进制表示)
x:0000 1000
y:0000 1010
操作数x | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
---|---|---|---|---|---|---|---|---|
操作数y | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
值z | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
0000 1000即为z的值,z=8
|:按位或
当两个操作数其中一个为时,值为一,都为0时则为0
例:假使
byte x=8,y=10;
z=x|y;
分别计算出x与y的补码(正数的补码是该数的二进制表示)
x:0000 1000
y:0000 1010
操作数x | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
---|---|---|---|---|---|---|---|---|
操作数y | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
值z | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
0000 1010即为z的值,z=10
~:按位非
当操作数为1时,值为0,操作数为0时,值为1
例:假使
byte x=8;
byte y=~x;
计算出x的补码(正数的补码是该数的二进制表示)
x:0000 1000
操作数x | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
---|---|---|---|---|---|---|---|---|
值y | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 |
1111 0111即为y的值,y=-119
^:按位异或
当两个操作数有且仅有一个为1时,值为1,否则值皆为0
例:假使
byte x=8,y=10;
byte z=x^y;
分别计算出x与y的补码(正数的补码是该数的二进制表示)
x:0000 1000
y:0000 1010
操作数x | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
---|---|---|---|---|---|---|---|---|
操作数y | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
值z | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
0000 0010即为z的值,z=2
<<:左位移运算符
符号位不变,高位溢出,低位补0,
例:假使
byte x=8;
byte y=x<<2
计算出x的补码(正数的补码是该数的二进制表示)
x:0000 1000
左移:00 | 0010 00xx (最高位不变,二进制位向左移动了2位,高位溢出部分移除,低位补0) 0010 0000
0010 0000即为y的值,y=32
>>:右位移运算符
符号位不变,低位溢出,高位用符号位补
例:假使
byte x=-8;
byte y=x>>2
计算出x的补码(负数的补码是该数的反码+1)
原码 | 1000 1000 |
---|---|
反码 | 1111 0111 |
补码 | 1111 1000 |
右移:1111 1110 | 00 (符号位不变,二进制值向右移动两位,高位用符号位补,低位溢出的部分移除) 1111 1110,再根据新得到的补码计算出值
补码 | 1111 1110 |
---|---|
反码 | 1111 1101 |
原码 | 1000 0010 |
1000 0010即为y的值,y=-2
<<<:无符号右移运算符
符号位跟着移动,低位溢出,高位补0。
例:假使
byte x=-8;
byte y=x>>2
计算出x的补码(负数的补码是该数的反码+1)
原码 | 1000 1000 |
---|---|
反码 | 1111 0111 |
补码 | 1111 1000 |
右移:0011 1110 | 00 (符号位变,二进制值向右移动两位,高位用0补,低位溢出的部分移除) 0011 1110,再根据新得到的补码计算出值
补码 | 0011 1110 |
---|---|
反码 | 0011 1101 |
原码 | 0100 0010 |
0100 0010即为y的值,y=66