2013-09-24 193 views
4
int mystery(int x, int n) 
{ 
    return (x + (x>>31 & ((1 << n) + ~0))) >> n; 
} 

我一直在想出這個代碼是如何工作的。這是我到目前爲止有:這段代碼做了什麼?

  • 轉移N個左超過一個,
  • 補充說,結果1^32(?爲什麼)
  • ANDS這個結果與x轉移到31(不會這只是清除x的值>> 31?)
  • 並將其移入由n個權之前,增加了X(再次,我不明白爲什麼)
+2

看看x和n變量的類型是什麼可能很有趣。 – SirDarius

+0

x和n如何定義? 32b或64b? – Leeor

+1

如果'x'是一個'int32',那麼'x >> 31'在數字爲負數時返回'1',如果數字爲0則返回'0'或爲正數。 – SJuan76

回答

11

它除以2^n,其中正確的舍入(向零回合),以使該表達等同於:

y = x /(1 < < n);

如果坐幼稚的方法來除以2^N,即

y = x >> n; 

你對於x 0 <

表達的這一部分不正確的舍入:(x>>31 & ((1 << n) + ~0))等於零爲x> = 0,但對於x < 0,它會通過加上2^n - 1來適當地調整結果。

請注意嚴格地說,表達式依賴於特定於實現的行爲,因爲它假定right shifti一個有符號整數保留符號位。雖然大多數編譯器和平臺都是如此,但無法保證,所以表達式不是100%安全或便攜的。

還要注意,表達式有一個硬編碼假設,即int爲32位,這也使得它不可移植。與任何int大小一起使用的更便攜版本將是:

return (x + (x >> (sizeof(int) * CHAR_BIT - 1) & ((1 << n) + ~0))) >> n; 
+1

我試過了,我得到0..Never想'x <0'..Nice ans ... + 1 – Anirudha

+0

OP說變量的返回類型和類型是'int'。在int爲64位的環境中,它的工作原理是否相同? – SirDarius

+0

否 - 它假定32位整數(即int32_t)。然而,使其更加通用並不難 - 我用更便攜的版本更新了答案。 –