2010-06-09 81 views
3

我正在教我自己的Java和我工作通過Java中的思維練習。爲什麼右移運算符產生一個零而不是一個?

在116頁練習11中,您應該右鍵移動整數的整數位置,並用Integer.toBinaryString顯示每個位置。

public static void main(String[] args) { 
int i = 8; 
System.out.println(Integer.toBinaryString(i)); 
int maxIterations = Integer.toBinaryString(i).length(); 
int j; 
for (j = 1; j < maxIterations; j++) { 
    i >>= 1; 
System.out.println(Integer.toBinaryString(i)); 
} 

在解決引導的輸出是這樣的:

1000 
1100 
1110 
1111 

當我運行這段代碼我得到這個:

1000 
100 
10 
1 

這到底是怎麼回事。數字是否被切斷?

我正在使用jdk1.6.0_20 64位。本書使用jdk1.5 32bit。

+0

您的結果對於簡單地右移數字是正確的行爲。 「解決方案」應該說明什麼,我不明白。 – zerm 2010-06-09 16:39:17

回答

9

看起來這本書有錯誤。

右移操作將所有位移到右側,移除最低有效位。如果您將結果對齊(例如,通過填充零),這會讓您更有意義。

00001000 
00000100 
00000010 
00000001 
00000000 

的最高位移位是:

  • 0,如果你的數字爲正數
  • 1,如果你的數字是負數。

如果你想最終的結果是那些然後嘗試使用像-8而不是8

11111111111111111111111111111000 
11111111111111111111111111111100 
11111111111111111111111111111110 
11111111111111111111111111111111 

負數如果您使用的>>>代替>>那麼零將永遠被轉移無論數量是正數還是負數。

+0

這聽起來不像書中的錯誤,如果你使用4位和8位(結果可能是錯誤,因爲Java不會讓你只用4位工作),結果就不一樣了。 – 2010-06-09 16:48:24

3

當給定正整數作爲輸入時,右移運算符最終產生一個零是正確的。

最好是把它作爲所有數字都右移的操作,最右邊的數字被切斷和一個額外的零添加到左側,即模式是:

00001000 
00000100 
00000010 
00000001 
00000000 
00000000 
3

從位運算符Java Tutorials Page

無符號向右移位運算符 「>>>」移動零到最左邊的 位置,而最左邊的位置 後「>>」依賴於符號擴展。

由於8是正的,所以零移位。如果i爲負值,則會改爲移位(保持整數上的相同符號)。

+0

但是這並不能解釋爲什麼如果我們移動32位'>> 32',我們會得到相同的數字! – Pacerier 2011-11-18 03:11:40

2

右移操作符將您的位移動到右側,即

01000 
00100 
00010 
00001 

右移將填滿最左邊的位,並具有與移位前相同的值。 由於最左邊的位是符號,所以正值將被零填充,負值將被填充1。

1

如果設置在INT像

int i = 1 << 31; 

的higest位你會看到所描述的行爲,該標誌將換擋過程中被保留。 我認爲這是一個說明操作的例子。

10000000000000000000000000000000 
11000000000000000000000000000000 
11100000000000000000000000000000 
11110000000000000000000000000000 
11111000000000000000000000000000 
11111100000000000000000000000000 
11111110000000000000000000000000 
.... 
11111111111111111111111111111000 
11111111111111111111111111111100 
11111111111111111111111111111110 
11111111111111111111111111111111 
+0

你有沒有找到錯位的方向? – Pacerier 2011-11-18 03:12:58

1

你似乎認爲variable >>= 1將一個移動到變量上。 1實際上指定多少次來移動變量。無論位於最重要的位置,簽名的數字都會改變。 >>>強制該數字無符號行爲並始終在零點上移動。

相關問題