我的代码如下:
int fitsBits(int x, int n) {
int twos = ~x + 1; //two's complement
int ans;
ans = (twos >> (n);
ans = !ans;
return ans;
}
在纸上工作,似乎工作正常,但在实际测试时失败了,我不确定原因。
答案 0 :(得分:1)
我假设您正在使用2s补码机(副符号幅度或其他类型的算术)并且还需要避免循环和条件。这显然是某种谜题,所以我们不要担心可移植性并假设32位int
。
如果值为正,则n-1
到int
的最高位的所有位必须为零。如果值为负,则相同的位必须为1。因此,一种方法是检查这些位是否正确。
这相当于检查x >> (~0+n)
是否为x
是否为全为零,否则为{1}}。它"转移"可以自由拥有任何值的位。
我们还可以构建一个掩码,如果x
为正,则全部为零,否则为x >> 31
。
最后,我们可以使用int
检查所有a
s b
和!(a ^ b)
的相等性。
把所有这些放在一起,你得到:
int fitBits(int val, int nbits) {
return !((val >> 31) ^ (val >> (~0 + nbits)));
}
答案 1 :(得分:0)
您需要日志库2.
#include <stdio.h>
int fitsBits(unsigned int v, unsigned int n) {
unsigned int r = 0; // lg(v)
while (v >>= 1) {
r++;
}
if(r >= n) return 1;
return 0;
}
int main () {
printf(" 5,3 => %d\n", fitsBits( 5,3));
printf(" -4,3 => %d\n", fitsBits(-4,3));
}
输出:
5,3 =&gt; 0
-4,3 =&gt; 1