如何查看数字x的两个补码是否可以用n个位表示

时间:2016-09-10 20:24:59

标签: c

  • fitsBits - 如果x可以表示为
  • ,则返回1
  • n位,2的补码整数。
  • 1< = n< = 32
  • 示例:fitsBits(5,3)= 0,fitsBits(-4,3)= 1
  • 法律视角:! 〜& ^ | +<< >>

我的代码如下:

int fitsBits(int x, int n) {
    int twos = ~x + 1; //two's complement
    int ans;
    ans = (twos >> (n);
    ans = !ans;
    return ans;
}

在纸上工作,似乎工作正常,但在实际测试时失败了,我不确定原因。

2 个答案:

答案 0 :(得分:1)

我假设您正在使用2s补码机(副符号幅度或其他类型的算术)并且还需要避免循环和条件。这显然是某种谜题,所以我们不要担心可移植性并假设32位int

如果值为正,则n-1int的最高位的所有位必须为零。如果值为负,则相同的位必须为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