[英]What does this code do?
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。
請注意,嚴格來說,該表達式依賴於特定於實現的行為,因為它假定右移有符號整數會保留符號位。 盡管這對於大多數編譯器和平台都是如此,但不能保證,因此該表達式不是100%安全或可移植的。
還要注意,該表達式具有硬編碼的假設,即int為32位,這也使其不可移植。 與int的任何大小都兼容的更可移植的版本是:
return (x + (x >> (sizeof(int) * CHAR_BIT - 1) & ((1 << n) + ~0))) >> n;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.