簡體   English   中英

該代碼的作用是什么?

[英]What does this code do?

int mystery(int x, int n)
{
   return (x + (x>>31 & ((1 << n) + ~0))) >> n;
}

我一直試圖弄清楚這段代碼是如何工作的。 這是我到目前為止的內容:

  • 向左移n,
  • 將該結果添加到1 ^ 32(為什么?)
  • 並且將這個結果從x移到31(這是否只是清除x >> 31的值?)
  • 並且在它移動n之前就加上x(再次,我不明白為什么)

它以正確的舍入(向零舍入)除以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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM