天天看點

java >> 與 >>> 移位運算符java >> 與 >>> 移位運算符

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