C++如何获取变量的位长?

qaz*_*y23 4 c++ bits

假设有一个变量int x.它的大小是4个字节,即32位.

然后我为这个var赋值,x = 4567(二进制10001 11010111); 所以现在,在内存中它应该是这样的:

00000000 00000000 000 10001 11010111

有没有办法得到重要的位长度.在我的例子中,比特长度将是13(我用粗体标记它们).如果我使用sizeof(x)它返回4个字节,其大小为int.如何只获得代表数字的位大小(之后没有不必要的零)?

Com*_*hip 7

警告:数学提前.如果你感到娇气,请跳到TL; DR.

你真正想要的是设置的最高位.让我们写出二进制数10001 11010111的实际含义:

x = 1 * 2^(12) + 0 * 2^(11) + 0 * 2^(10) + ... + 1 * 2^1 + 1 * 2^0
Run Code Online (Sandbox Code Playgroud)

其中*表示乘法并且^是取幂.

你可以这样写

2^12 * (1 + a)
Run Code Online (Sandbox Code Playgroud)

在哪里0 < a < 1(确切地说a = 0/2 + 0/2^2 + ... + 1/2^11 + 1/2^12).

如果你取对数(基数2),让我们用log2这个数字来表示它

log2(2^12 * (1 + a)) = log2(2^12) + log2(1 + a) = 12 + b.
Run Code Online (Sandbox Code Playgroud)

因为a < 1我们可以得出结论,1 + a < 2因此b < 1.

换句话说,如果你取下它log2(x)并将其向下舍入,你将得到最大的2次幂(在这种情况下为12).由于功率从0开始计数,比特数比这个功率多一个,即13.因此:

TL; DR:

表示该数字所需的最小位数x由下式给出

numberOfBits = floor(log2(x)) + 1
Run Code Online (Sandbox Code Playgroud)

  • 数字正确且非常低效. (5认同)
  • @hritik:log2是浮点运算。它计算小数点后的许多位。Floor() 然后将它们扔掉。 (3认同)

小智 5

unsigned bits, var = (x < 0) ? -x : x;
for(bits = 0; var != 0; ++bits) var >>= 1;
Run Code Online (Sandbox Code Playgroud)

这应该为您做。