java >> 与 >>> 移位运算符
区别
符号 | 说明 |
---|---|
>>> | 无符号右移,无论是正数还是负数,右移后都是左补0 |
>> | 有符号右移,左边第一位是1则补1,左边第一位是0则补0 |
<< | 左移,左移时皆为右补0 |
示例
code
public static void main(String[] args) {
int i = -8;
int j = i >>> 1; // 无符号右移1位
int k = i >> 1; // 有符号右移动1位
System.out.println("原值为:" + i);
System.out.println("原址无符号右移1位:" + j);
System.out.println("原址带符号右移1位:" + k);
System.out.println("原值二进制为:" + Integer.toBinaryString(i));
System.out.println("原址无符号右移1位二进制为:" + Integer.toBinaryString(j));
System.out.println("原址带符号右移1位二进制为:" + Integer.toBinaryString(k));
}
输出结果
原值为:-8
原址无符号右移1位:2147483644
原址带符号右移1位:-4
原值二进制为:11111111111111111111111111111000
原址无符号右移1位二进制为:1111111111111111111111111111100
原址带符号右移1位二进制为:11111111111111111111111111111100
过程说明
十进制8转化为2进制:
0000 0000 0000 0000 0000 0000 0000 1000
十进制-8转化为二进制,采用 补码方式,即在+8的二进制的基础上 按位取反,末位+1:
先取反:
1111 1111 1111 1111 1111 1111 1111 0111
再加1,得到-8的二进制码值:
1111 1111 1111 1111 1111 1111 1111 1000
-8 无符号右移1位 ,-8 >>> 1 :
0111 1111 1111 1111 1111 1111 1111 1100
^
所得值转化为十进制为: 2147483644
-8 带符号右移1位,-8 >> 1 :
1111 1111 1111 1111 1111 1111 1111 1100
^
所得值转化为十进制位: -4