2013-10-28 108 views
-1

有人請解釋如何解決這樣的任務?整數移位運算符

int x = (Integer.MIN_VALUE << 1) >> 1; 

我想了解如何解決這樣的例子?如果樣本包含Integer.MIN_VALUE(Integer.MAX_VALUE),我需要做什麼?

+4

等等,具體的任務是什麼? –

+0

什麼是實際問題...?你知道輪班員的工作原理嗎? – nhgrif

+0

這是功課嗎?你需要在作業後計算出x的價值嗎? –

回答

2

移位運算符(y << x)僅將y的位向左移位'x'個位置。最右邊的位變成0>>運算符向右移動,最左邊的位(符號位)的值被複制到新的最左邊的位中。

制定出你的答案,你需要爲初始值(Integer.MIN_VALUE的)的位模式,然後做的操作來獲得所產生的位模式。然後,您可以將其轉換回十進制值。

+0

所以,我需要提出我的號碼2^31作爲一小段代碼,然後執行操作以獲得最終的位模式。我認爲這是解決這個問題的快速方法。 – Drylozav

+0

快速的方法是編寫一個簡短的程序來完成這項工作並給出輸出結果,或者做一個程序員的計算器(Windows中的calc.exe對此很有用)。但要真正理解發生的事情,最好手工做幾次。 –

1

如果你想了解的位移位運營商的工作,我建議兩兩件事:

  • 首先,對他們做什麼讀了一些指南:例如herehere
  • 編寫一些代碼並查看輸出。這樣您就可以看到位移操作符實際上如何影響Integer.MIN_VALUEInteger.MAX_VALUE等值。
+0

但是什麼代碼可以顯示工作班次? – Drylozav

+1

你真的讀過我給的鏈接嗎? – DanielGibbs

+0

yeaр。立即讀取 – Drylozav

2

嗯,你可以只需按照簡短教程http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html

概括地說,通過做<<(左移),再移動號碼的二進制表示向左
也就是說,如果x = 0b0010,然後x << 1成爲0b0100 ,新的'零'位被追加到右邊。

相若方式,對於右移位: 如果x = 0b1010,然後x >> 1變得0b1101,最右邊的位自敗,新的「一」位(取決於最左邊的位的值)將被附加在左側。

你需要找出Integer.MIN_VALUE二進制表示,以解決您的難題,這不應該是非常棘手的。

1

的最小值被表示爲10000000000000000000000000000000。這是32 1。爲了清楚起見,讓我們假裝我們只用4位工作。在這種情況下,MIN_INT將是1000。這也適用於32位。

然後,我們要留下1移<<,這將1個職位的所有位在左移。因此,1000將變爲0000。這就像乘以2(雖然在這種情況下,我們得到溢出!),

然後我們要右移「>>」 1,這將1個職位的所有位右移。在這種情況下,當右移時複製符號位將變爲0000。如果是1111,它將變爲1111。這就像是除以2,除了在某些情況下,因爲你必須厭倦標誌位複製。

+0

MIN_VALUE實際上是1,隨後爲0,IE 1000爲4位。無論單詞長度如何,所有1都將始終爲-1。 – Radiodef

+0

哦,上帝,你是對的,我完全搞砸了。我會解決這個問題 – Clark