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