int mystery(int x, int n)
{
return (x + (x>>31 & ((1 << n) + ~0))) >> n;
}
我一直在想出這個代碼是如何工作的。這是我到目前爲止有:這段代碼做了什麼?
- 轉移N個左超過一個,
- 補充說,結果1^32(?爲什麼)
- ANDS這個結果與x轉移到31(不會這只是清除x的值>> 31?)
- 並將其移入由n個權之前,增加了X(再次,我不明白爲什麼)
int mystery(int x, int n)
{
return (x + (x>>31 & ((1 << n) + ~0))) >> n;
}
我一直在想出這個代碼是如何工作的。這是我到目前爲止有:這段代碼做了什麼?
它除以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;
看看x和n變量的類型是什麼可能很有趣。 – SirDarius
x和n如何定義? 32b或64b? – Leeor
如果'x'是一個'int32',那麼'x >> 31'在數字爲負數時返回'1',如果數字爲0則返回'0'或爲正數。 – SJuan76