【发布时间】:2013-04-27 18:52:29
【问题描述】:
我一直在搞乱我在互联网上发现的按位运算符问题,并找到了一个完全让我难过的问题。
int rpwr2(int x, int n)
{
//Legal ops: ! ~ ^ | + << >>
//My attempt at a solution:
int power = (1 << n) + ~0;
return x & power;
}
【问题讨论】:
-
那么问题是什么?
-
检查答案的程序说它不正确:“Test rempwr2(-2147483647[0x80000001], 1[0x1]) failed... ... 给出 1[0x1]。应该是 -1[0xffffffff]"
-
它必须是可移植的,还是我们可以假设二进制补码和算术右移?
-
用
int mask = x >> 31; return (result + mask) ^ mask;有条件地否定结果显然不可移植。 -
这些问题仅针对 Intel 32 位架构构建。我们可以假设二进制补码和算术右移。
标签: c bit-manipulation operator-keyword