int mystery(int x, int n)
{
return (x + (x>>31 & ((1 << n) + ~0))) >> n;
}
我一直试图弄清楚这段代码的工作原理。这就是我到目前为止所做的:
答案 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;