假设有一个变量int x.它的大小是4个字节,即32位.
然后我为这个var赋值,x = 4567(二进制10001 11010111); 所以现在,在内存中它应该是这样的:
00000000 00000000 000 10001 11010111
有没有办法得到重要的位长度.在我的例子中,比特长度将是13(我用粗体标记它们).如果我使用sizeof(x)它返回4个字节,其大小为int.如何只获得代表数字的位大小(之后没有不必要的零)?
警告:数学提前.如果你感到娇气,请跳到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
unsigned bits, var = (x < 0) ? -x : x;
for(bits = 0; var != 0; ++bits) var >>= 1;
Run Code Online (Sandbox Code Playgroud)
这应该为您做。
| 归档时间: |
|
| 查看次数: |
5601 次 |
| 最近记录: |