计算存储十进制数所需的位数

fud*_*din 18 unsigned decimal unsigned-integer

这是一个我坚持的功课问题.

考虑无符号整数表示.存储包含以下内容的十进制数需要多少位:

i) 3 digits ii) 4 digits iii) 6 digits iv) n digits
Run Code Online (Sandbox Code Playgroud)

我知道无符号整数的范围是0到2 ^ n,但我不知道表示数字所需的位数如何取决于它.请帮帮我.

提前致谢.

gua*_*npt 27

那么,您只需计算每个案例的范围,并找到高于该范围的2的最低功率.

例如,在i)中,3个十进制数字 - > 10 ^ 3 = 1000个可能的数字,因此您必须找到高于1000的最低2的幂,在这种情况下是2 ^ 10 = 1024(10位).

编辑:基本上你需要找到你所拥有的位数的可能数字的数量,然后找到哪个数字位数(在另一个基数,在这种情况下,基数2,二进制)至少具有与一个数字相同的可能数字十进制.

计算给定位数的可能性数量: possibilities=base^ndigits

所以,如果你有十进制的3位数(基数10),你有10^3=1000可能.然后你必须找到二进制数位(位数​​,基数2),以便可能性的数量至少为1000,在这种情况下是2^10=1024(9位数不够,因为2^9=512它小于1000).

如果你概括一下,你有: 2^nbits=possibilities <=> nbits=log2(possibilities)

其中适用于i)给出:log2(1000)=9.97并且由于位数必须是整数,因此必须将其四舍五入为10.

  • 我相信正确的公式是`floor(log2(n))+ 1`,否则例如1024的结果将保持10,这是假的.[维基百科链接](http://en.wikipedia.org/wiki/Binary_logarithm#Information_theory) (5认同)
  • 嗯,这取决于你的语言环境,在葡萄牙我们使用','作为小数分隔符.无论如何,我把它改成'.' 在我的回答中. (2认同)

ex *_*ilo 8

可以由以b为基数的n位数字表示的最大数字是b n - 1。因此,可以用N 个二进制数字表示的最大数是2 N - 1。我们需要最小的整数N使得:

2 N - 1 ? b n - 1
? 2 N ? b ñ

取最后一个表达式两边的以 2 为底的对数给出:

日志2 2 N ? 对数2 b n
? 否 对数2 b n
? 否 log b n / log 2

因为我们想要满足最后一个关系的最小整数N,所以要找到N,找到log b n / log 2并取上限。

在最后一个表达式中,任何底数都适用于对数,只要两个底数相同即可。这里很方便,因为我们对b = 10的情况感兴趣,利用log 10 10 n == n使用以10为底的对数。

对于n = 3

N = ?3 / log 10 2? = 10

对于n = 4

N = ?4 / log 10 2? = 14

对于n = 6

N = ?6 / log 10 2? = 20

一般来说,对于n 个十进制数字:

N = ?n / log 10 2?


rgh*_*ome 7

存储n个整数所需的二进制位数的公式(例如,0n - 1)是:

log e(n)/ log e(2)

并且围捕.

例如,对于值-128到127(有符号字节)或0到255(无符号字节),整数个数是256,因此n是256,从上面的公式得到8.

对于0n,在上面的公式中使用n + 1(有n + 1个整数).

在您的计算器上,log e可能只标记为logln(自然对数).

  • 如果我没记错的话,_**log2(n)**_ 应该可以正常工作。 (4认同)
  • 感谢您提供一个简单的公式而不是冗长的解释。更实用,更重要。 (3认同)