存储正整数需要多少位?

use*_*008 19 binary integer

你需要多少位才能存储一个正整数,例如数十亿?您是否必须使用log2 N才能找到它?

小智 36

由于我已经看到错误报告的答案很多次,我想我会发布正确答案.

表示正整数n所需的位数是

bits = floor( log2(n) + 1 )
Run Code Online (Sandbox Code Playgroud)

其中log2表示日志库2.

  • 这个解决方案给了我一个错误的结果,`n = 18446744073709551615`(在 `x86_64` 盒子上等于 `n = pow(2, 8 * sizeof(unsigned long))`),因为 `log2(n) = 64`这种情况和`+ 1`是多余的。使用 `bits = ceil(log2(n))` 有什么缺点吗? (3认同)
  • @ selurvedu,@ superdweeble您在说什么,为什么人们喜欢您的评论?Math.log2(16).ceil等于4,但是我们需要5,所以Math.log2(16).floor +1是正确的。由于准确性不足,`Math.log2((1 << 64)-1)`等于`64`。 (3认同)
  • 正如@selurvedu 指出的那样,尽管声称正确,但如果 n 是 2 的幂,则此答案是错误的。请改用 ceil(log2(n)) 。 (2认同)
  • @puchu 是对的,更喜欢答案,请不要再对前两条评论点赞 (2认同)

Lee*_*Gup 10

是.存储在k比特中的最大数量是2 ^ k-1,因为比特有2 ^ k个选项,其中一个是零.
因此,存储数字N所需的位数是log2(N),但由于没有半位,因此需要将其四舍五入到上面的cloest整数.

注意:如果您需要包含负数,则该符号必须再多一位.


mjg*_*py3 6

只需添加到上一个答案,您就可以找出N使用任何对数基数来数学表示一个数字所需的位数。例如,假设我想知道代表数字12345所需的位数,但是我的计算器只知道ln(自然对数)。

所以,

2^b = 12345
Run Code Online (Sandbox Code Playgroud)

考虑到ln双方。

ln(2^b) = ln(12345)
Run Code Online (Sandbox Code Playgroud)

当然,对数的对数是指数乘以仅对数的对数,因此,

b*ln(2) = ln(12345)
Run Code Online (Sandbox Code Playgroud)

将两边除以ln(2),

b = ln(12345) / ln(2)
Run Code Online (Sandbox Code Playgroud)

当然,正如其他答案所述,您将需要四舍五入该结果,因为要表示某个数字,您需要2 ^ b等于或大于该数字。

所以,

b = ceil(ln(12345) / ln(2))
Run Code Online (Sandbox Code Playgroud)

ceil(f)f到最接近的整数。

使用以上过程,您可以N使用任何log-base 找到任意数量所需的位数logb,即

b = ceil(logb(N) / logb(2))
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您使用的是基于0的整数,其中000对应于0,111对应于7,则实际上需要在此公式中加1。 (2认同)