这段代码有什么作用?

时间:2013-09-24 14:44:40

标签: c bit-manipulation

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

我一直试图弄清楚这段代码的工作原理。这就是我到目前为止所做的:

  • 左移一个,
  • 将结果添加到1 ^ 32(为什么?)
  • 这个结果将x移到31(这不会只是清除x>&gt;&gt; 31的值?)
  • 并且在它移动n之前,添加x(再次,我不明白为什么)

1 个答案:

答案 0 :(得分:11)

它除以2 ^ n并进行正确的舍入(舍入为零),以便表达式等效于:

y = x /(1 <&lt; n);

如果你采用天真的方法来划分2 ^ n,即

y = x >> n;

你得到x&lt;的舍入不正确0

表达式的这一部分:(x>>31 & ((1 << n) + ~0))对于x&gt; = 0等于零,但对于x&lt; 0它通过添加2 ^ n - 1来适当调整结果。

请注意,严格来说,表达式依赖于特定于实现的行为,因为它假定右移有符号整数会保留符号位。虽然大多数编译器和平台都是如此,但无法保证,因此表达式不是100%安全或可移植。

另请注意,表达式具有硬编码的假设,即int为32位,这也使其不可移植。适用于任何大小的int的更便携版本将是:

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