我必须计算整数的二进制表示的长度。 我尝试过这样的事情:
int binaryLength(int n)
{
int i = 32;
while (i > 0)
{
if (n >> i & 1) break;
else i--;
}
return i;
}
但是当我的数字像9(1001)时,这个函数会返回32。
答案 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