简介
java 中有七个位运算符 分别是& 、| 、~ 、^ 、<< 、 >> 、 >>> 博客中对于每一个运算符否进行了简单的介绍。
一、运算符介绍
运算符 | 运算规则 | 备注 |
---|---|---|
&(与运算) | 1&1 = 0, 0&1 =0,0&0=0 | 无 |
∣ \mid ∣ (或运算) | 1 ∣ \mid ∣ 1=1,1 ∣ \mid ∣ 0 = 1,0 ∣ \mid ∣ 0 = 0 | 无 |
^(异或运算) | 0^0=0, 0^1=1, 1^0=1, 1^1=0 | 无 |
<< (左移运算符) | m<<n ⇒ \Rightarrow ⇒ m × \times × 2^n | 低位补0 |
>> (右移运算符) | m>>n ⇒ \Rightarrow ⇒ ÷ \div ÷ 2^n | 正数高位补0 负数高位补1 |
>>> (无符号右移) | m>>>n m 指定要移位值n移动的位数。 | 无论正负数高位补0 |
二、运算示例
1.左移运算符
左移运算符(正数示例 32位高位0省略):
8<<2
8 转化为二进制数字为:1000
左移两位为: 0010 0000
转为十进制数为: 32
等价于: 8 * 2^2 = 32
左移运算符(负数示例):
在计算机中负值以其正值的补码形式出现
-8<<2
8的原码:0000 0000 0000 0000 0000 0000 0000 1000
8的反码:1111 1111 1111 1111 1111 1111 1111 0111
8的补码:1111 1111 1111 1111 1111 1111 1111 1000
因此-8的二进制表示为:
1111 1111 1111 1111 1111 1111 1111 1000
左移两位为:
1111 1111 1111 1111 1111 1111 1110 0000
转为反码:
1111 1111 1111 1111 1111 1111 1101 1111
转为原码
0000 0000 0000 0000 0000 0000 0010 000
转为十进制数:
32
加上符号为:
-32
等价于: -8 * 2^2 = -32
左移运算符(代码示例):
public static void main(String[] args) {
int a = 8;
int b = 2;
int c = -8;
System.out.println(Integer.toBinaryString(a));//二进制输出
System.out.println(Integer.toBinaryString(c));//二进制输出
System.out.println(a<<b);
System.out.println(c<<b)
}
输出结果为:
1000 //8的二进制表示
11111111111111111111111111111000 // -8的二进制表示
32 // 8 左移两位结果
-32 // -8左移两位结果
2.右移运算符
右移运算符(正数示例 32位高位0省略):
8 >>2
8 转化为二进制数字为:1000
右移两位为: 10 //高位补0 (省略了)
转为十进制数为: 2
右移运算符(负数示例):
在计算机中负值以其正值的补码形式出现
-8>>2
8的原码:0000 0000 0000 0000 0000 0000 0000 1000
8的反码:1111 1111 1111 1111 1111 1111 1111 0111
8的补码:1111 1111 1111 1111 1111 1111 1111 1000
因此-8的二进制表示为:
1111 1111 1111 1111 1111 1111 1111 1000
右移两位为:
1111 1111 1111 1111 1111 1111 1111 1110 //高位补1
转为反码:
1111 1111 1111 1111 1111 1111 1111 1101
转为原码
0000 0000 0000 0000 0000 0000 0000 010
转为十进制数:
2
加上符号为:
-2
右移运算符(代码示例):
public static void main(String[] args) {
int a = 8;
int b = 2;
int c = -8;
System.out.println(Integer.toBinaryString(a));//二进制输出
System.out.println(Integer.toBinaryString(c));//二进制输出
System.out.println(a>>b);
System.out.println(c>>b);
}
输出结果为:
1000 //8的二进制表示
11111111111111111111111111111000 // -8的二进制表示
2 //8 右移两位结果
-2 //-8 右移两位结果
2.无符号右移运算符
无符号右移移运算符(正数示例 32位高位0省略):
8 >>> 2
8 转化为二进制数字为:1000
右移两位为: 10 //高位补0 (省略了)
转为十进制数为: 2
无符号右移运算符(负数示例):
在计算机中负值以其正值的补码形式出现
-8>>2
8的原码:0000 0000 0000 0000 0000 0000 0000 1000
8的反码:1111 1111 1111 1111 1111 1111 1111 0111
8的补码:1111 1111 1111 1111 1111 1111 1111 1000
1111 1111 1111 1111 1111 1111 1111 1000
因此-8的二进制表示为:
1111 1111 1111 1111 1111 1111 1111 1000
右移两位为:
0011 1111 1111 1111 1111 1111 1111 1110 //高位补0 (符号位为0变为正数 正数原码反码补码相同)
转为十进制数:
1073741822
无符号右移运算符(代码示例):
public static void main(String[] args) {
int a = 8;
int b = 2;
int c = -8;
System.out.println(Integer.toBinaryString(a));//转为二进制
System.out.println(Integer.toBinaryString(c));//转为二进制
System.out.println(a>>>b);
System.out.println(c>>>b);
System.out.println(Integer.toBinaryString(c>>>b));
}
输出结果为:
1000 //8的二进制表示
11111111111111111111111111111000 // -8的二进制表示
2 //8 无符号右移两位结果
1073741822//-8 无符号右移两位结果
111111111111111111111111111110//-8 无符号右移两位的二进制结果 (前面省略了2个0)
总结
位运算符中& 、|、^、~ 这四个运算符的运算较为简单,没有在此进行具体的讨论,相对复杂的右移、无符号右移、左移运算都给除了具体的例子,帮助理解。