2010-10-10 52 views
0

對有符號整數-28進行邏輯右移3運算。什麼是正確的答案?對有符號整數進行邏輯右移運算

  1. +203
  2. +83
  3. +3
  4. -3

2的-28補是11100100. 現在,如果我申請邏輯右移操作,我沒有得到以上任何一個答案。

+1

你嘗試寫作和編譯代碼看?既然我沒有和你面談,我想我會繼續回答。 – 2010-10-10 04:35:03

+0

是的,我嘗試使用>>>在java中執行此操作,我得到了非常大的數字(536870908)。 – Jagan 2010-10-10 04:41:21

+0

@Jagan使用'(signed int)((unsigned int)-28 >> 3)'在C中得到了相同的結果。如果你仔細想一想,獲得一個非常大的正值#是有意義的,因爲你已經把曾經是符號位的1變成了第三個最重要的位。 – AlcubierreDrive 2010-10-10 04:53:50

回答

1

我幾乎可以肯定這是個詭計的問題。

面試官看到你是否會回答「-3」。如果你有(錯誤的推理,因爲28 >>> 3是3,那麼-28 >>> 3是-3),他會意識到你不明白二進制補碼。

他希望你回答這四個選擇中沒有一個是正確的。他希望你

  1. 解釋如何邏輯右移, 不像算術右移,通過轉動符號 位到幅度
  2. 點的部分將 轉小負號變成了一個巨大 正數,答案取決於 使用多少個字節來表示 一個int
+0

但是這是書面測試問題,我沒有其他選擇:-) – Jagan 2010-10-10 05:15:30

+1

如果這是一個書面測試,你正在採取的過程中,你不能在這裏發佈它,我不能幫你。 – AlcubierreDrive 2010-10-10 05:16:41

+1

@Jon Rodriguez:我不在考場編寫在線考試。我將在1或2個月後參加考試。那麼知道我不知道的事情有什麼不對? – Jagan 2010-10-10 05:23:27

0

也許,關鍵是不要假定二進制補碼錶示。假設sign-and-magnitude表示,答案可以是-3,因爲大多數移位實現不涉及符號位。

0

這是一個愚蠢的問題:

  • 無論是0或1的左邊添加並沒有被普遍爲負數定義(維基百科說「懸空位位置填寫,一般帶零點「 - 我的強調)
  • 所涉及的整數大小沒有討論,並且
  • 有多個使用中的負數的按位表示。

一些語言(如Java我相信)新的最顯著位,使得沒有一個合適的CPU指令的任何平臺將不得不發行數計算所需的答案,而其它語言可作出在CPU本身提供的行爲之間實現定義的選擇。

2的補數是負數最常見的表示形式。你的問題是「-2的補碼是11100100」......我猜這不是問題的一部分(如果是這樣,有點奇怪,因爲它是在答案之後)。仍然...

如果我們用2的補碼運行...

11100100 >> 3 = 00011100 or 11111100 = 28 or -4 

如果表示爲1的補:

11100011 >> 3 = 00011100 or 11111100 = 28 or -3 

如果表示爲符號位,絕對值:

10011100 >> 3 = 00010011 or 11110011 = 19 or -(127-12)=-115 

(note that the question says a logical bit shift, which by definition ignores any possible interpretation of the bits, so the sign bit is shifted along with others) 

在一個int重新#bits ...我認爲這很明顯,那會導致一個值太大而不能匹配任何選項,否則它不會有任何區別(如果1被添加到左邊1或2的補碼),我們可以忽略這個問題。因此,除非我的上述快速計算結果滑落,否則-3是唯一可以在任何合理架構上正確的答案,但仍然不太可能。總之,我想知道他們是不是真的在測試,看看誰有信心不回答問題,或者說沒有答案可能是正確的......

0

將有符號的整數移到right可以做很多事情:

  1. 如果數字是負數,它會簽名擴展結果(左移1位),這應該使數字看起來像一個較小的負數。
  2. 如果這個數字是正數,那麼它會將它移動兩位。

但是這種行爲在技術上是「實現定義的」。

請看到這個帖子:Are the shift operators (<<, >>) arithmetic or logical in C?