计算整数的二进制表示

时间:2016-11-28 12:03:21

标签: c

我必须计算整数的二进制表示的长度。 我尝试过这样的事情:

int binaryLength(int n)
{
      int i = 32;
      while (i > 0)
      {
           if (n >> i & 1) break;
           else i--;
       }
       return i;
 }

但是当我的数字像9(1001)时,这个函数会返回32。

4 个答案:

答案 0 :(得分:2)

如果我是你,我会放弃循环方式。

这是我所知道的最快方式 - 专门为32位int编码。它不适用于负整数(负整数的位模式无论如何都依赖于平台)。为64位int添加额外的行;该计划应该是显而易见的。

int binaryLength(int n)
{
    int i = 0; // the minimum number of bits required.
    if (n >= 0x7FFF) {n >>= 16; i += 16;}
    if (n >= 0x7F) {n >>= 8; i += 8;}
    if (n >= 0x7) {n >>= 4; i += 4;}
    if (n >= 0x3) {n >>= 2; i += 2;}
    if (n >= 0x1) {n >>= 1; i += 1;}
    return i;
}

答案 1 :(得分:0)

您可以通过执行以下操作找到长度:

{{1}}

即长度是N的日志基数2的上限。由于我无法记住日志库2的函数名称,我正在做上面的等价物。您需要N + 1来正确地说明N是2的直接幂,因此需要一个额外的位来表示它。示例N = 8 =二进制1000。 8的对数基数为3,3的上限为3,但9的对数基数为3.16993,3.16993的上限为4

答案 2 :(得分:0)

首先,考虑使用unsigned int - 我怀疑这是你想要的。然后一个合理的方法是继续将输入数字向下移动直到它为零。类似的东西:

unsigned int binaryLength(unsigned int n)
{
      unsigned int i = 0;
      while (n >>= 1)
      {
         ++i;
      }

      return i;
}

有更快的方法(你可以简单地使用查找表等)但这似乎接近你原来的方法。

答案 3 :(得分:0)

来自wikipedia

  

N位二进制补码数系统可以表示每个整数   在 - (2N - 1)到+(2N - 1 - 1)......

的范围内

这应该适用于负数和正数。

int binaryLength(int n)
{
    int num       = n;
    int nMinus1   = 0;
    int i         = 0;

    if(0 > num)
        num = -num;

    if(0 >= n)
    {
        while(((1<<nMinus1)-1) <= num)
        {
            nMinus1++;
        }
    } else {
        while((1<<nMinus1) <= num)
        {
            nMinus1++;
        }
    }

    i = nMinus1+1;

    printf("Number %d binary length %d\n", n, i);

    return 0;
}

使用一些输入进行测试:

Number 0 binary length 2                                                                                                                                            
Number 1 binary length 2                                                                                                                                            
Number -1 binary length 3                                                                                                                                           
Number 9 binary length 5                                                                                                                                            
Number -9 binary length 5