【发布时间】:2014-09-19 23:48:27
【问题描述】:
我在这个网站上看到了这个函数的一些其他实现,但我很好奇是否有人可以帮助我弄清楚为什么这个实现不起作用:
//fitsBits: return 1 if x can be represented as an n-bit, two's complement integer.
//1<=n<=32
//Examples: fitsBits(5,3)=0, fitsBits(-4,3)=1
//legal ops: ! ~ & ^ | + << >>
//Max ops: 15
int fitsBits(int x, int n) {
int mask = ~(1<<31);
return !(((x>>1)&mask)>>(~(~n+2)+1));
}
所以你可以稍微遵循我的逻辑,我将 x 向右移动一个,这可能会暴露一个额外的 1(算术移位)。所以我创建了一个掩码以确保它在移动 x 的其余部分之前变为零。最初我需要将 x n 次向右移动,如果有任何剩余的 1,则表示 x 不适合 n 位。由于我已将 x 向右移动了一位,因此我现在需要将其移动 n-1 次。
我得到的结果是:
ERROR: Test fitsBits(2147483647[0x7fffffff],31[0x1f]) failed...
...Gives 1[0x1]. Should be 0[0x0]
【问题讨论】:
标签: binary bit-manipulation bitwise-operators