2014-08-30 57 views
3

填補我想要做的左移,但與零填充,就像Java的左移,並用零

int number = 20 >>> 10 = (0000 0000 0000 0000 0000 0000 0001 0100) 
int number = 20 >>> 32‎ = (0000 0000 0000 0000 0000 0000 0000 0000) 

我想要做左移相同,由於沒有運營商< < <爲leftshift

int number = 20 << 32 = 0000 0000 0000 0000 0000 0000 0001 0100 ; 

我想用>>>運算符填充零。那我該怎麼做呢?

+2

這是不明確; 「>>> 32」和「32」都沒有任何影響,那麼你到底在問什麼? – 2014-08-30 11:07:53

+0

你已經說過'20 >>> 32'會給你全部關閉('0000 0000 0000 0000 0000 0000 0000 0000')。我沒有得到全面的關閉,我得到了'0001 0100'。 – 2014-08-30 11:19:26

+0

閱讀[規格](http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.19):*如果左邊的操作數的提升的類型是int,只有右側操作數的五個最低位用作移位距離。如果左側操作數的升級類型很長,那麼只有右側操作數的最低六位用作移位距離。* – 2015-05-20 18:38:31

回答

11

<<左移運營商將在零隻帶,只要你想。

有兩個右移位運算符(>>>>>)的原因是因爲在2的補碼形式中,負數在最左邊的位位置有一個位值1。右移位運算符>>將左側添加符號位(1在負數的情況下,並在0正數或零的情況下),而其他(>>>)會隨時添加零。

兩個右移運營商有其使用。

語言規範規定,如果位移運算符應用於int,因爲它的長度爲32位,則只有5位最低位用於確定移位數字的次數。如果按32移動這是二進制100000

所以,它相當於0轉移,這意味着沒有轉移!如果你想轉換一個64位的long,那麼最低位僅用於告知轉換次數。

+0

好吧,我明白了。我想這樣做在32位:(20 << 32),但我得到的結果= 20,而不是0,如果運算符<<用零填充然後,我必須得到0; – computerSPro 2014-08-30 11:13:50

+0

當移動「int」數時,只有5個最低位用於確定移位次數,而'32'的5個最低位爲'00000',所以不會發生移位。 – icza 2014-08-30 11:30:08

0

您需要使用長型,只使用最低的32位。 使用和運算符來完成。

long intMask = 0x00000000FFFFFFFFL; 
    long x = 0x00000000FFFFFFFFL; 
    x = x<<32; 
    int xi = (int)(x & intMask); 
    System.out.println("xi=" + xi); //Result will be 0 

見問題:Declaring an unsigned int in Java