Java中的三種移位操作
阿新 • • 發佈:2018-12-06
考慮下面程式的輸出:
public class Main {
static public void main(String args[]) throws Exception {
System.out.println( 0xff >>> 7 ); // 1
System.out.println( ((byte) 0xff) >>> 7 ); // 33554431
System.out.println( (byte) (((byte) 0xff ) >>> 7) ); // -1
}
}
-
三種移位符號
>>
是帶符號右移,若左運算元是正數,則高位補“0”,若左運算元是負數,則高位補“1”.<<
將左運算元向左邊移動,並且在低位補0.>>>
是無符號右移,無論左運算元是正數還是負數,在高位都補“0” -
三種移位符號作用的左運算元有五種:long,int,short,byte,char
但是在作用不同的運算元型別時,其具體過程不同, 遵循一下幾個原則:- int移位時,左邊的運算元是32位的,此時的移位符號作用在32位bit上。如:
1 >> 3
- long 移位時,左邊的運算元是64位的,此時移位符號作用在64位bit上。如:
1L >> 3
。 - short, byte,char 在移位之前首先將資料轉換為int,然後再移位,此時移位符號作用在32為bit上。如:
(byte)0xff >>> 7
, 是將11111111 11111111 11111111 11111111向右邊移動7位,得到00000001 11111111 11111111 11111111
- int移位時,左邊的運算元是32位的,此時的移位符號作用在32位bit上。如:
-
有1,2可知,當左運算元是long時,移位之後得到的型別是long,當左運算元是其它四中型別時,移位之後得到的型別是int,所以如果做運算元是byte,char,short 時,你用
>>=
>>>=
,<<=
其實是將得到的int 做低位擷取得到的數值。 -
三種移位符號除了對做運算元有操作規則外,其實對右運算元也有操作規則。如果左運算元(轉換之後的)是int,那麼右運算元只有低5位有效(因為int總共就32位,11111b = 31,所以規定移動32位相當於沒有移動)。如:
23 >> 33
, 結果與23 >>1
是一樣的,都是11;同理,如果左邊運算元是long,那麼右邊運算元只有低6位有效。
System.out.println(0xff >>> 7);
/*
0xff 本身就是一個int,其bits為:
00000000 00000000 00000000 11111111
無符號向右移動7位, 得到的bits為:
00000000 00000000 00000000 00000001
*/
System.out.println( ((byte) 0xff) >>> 7 );
/*
(byte)0xff 是一個byte,bits為:
11111111
首先轉換為int,其bits為:
11111111 11111111 11111111 11111111
向右邊無符號移動7為,得到的結果bits是:
00000001 11111111 11111111 11111111
*/
System.out.println( (byte) (((byte) 0xff) >>> 7) );
/*
(byte) 0xff 是一個byte,bits為:
11111111
首先轉換為int,其bits為:
11111111 11111111 11111111 11111111
向右邊無符號移動7為,得到的結果bits是:
00000001 11111111 11111111 11111111
然後轉換為byte,低位擷取得到bits:
11111111
<在輸出的時候轉換為int,其bits為:
11111111 11111111 11111111 11111111>
*/