【问题标题】:How many bits do you need to store a positive integer?存储一个正整数需要多少位?
【发布时间】:2012-08-29 10:39:57
【问题描述】:

存储一个正整数(例如数十亿)需要多少位?您是否必须使用 log2 N 才能找出答案?

【问题讨论】:

  • 整数或浮点数,精度如何?
  • 签名还是未签名?也就是说,负整数是否可能,或者您是否对仅表示非负整数感兴趣? (我从你的问题的上下文中得到它,你说的是整数,而不是浮点数。)
  • 是的,我在谈论正整数。那么它会是 log2 N 吗?

标签: binary integer


【解决方案1】:

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

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

bits = floor( log2(n) + 1 )

其中 log2 表示对数基数 2。

【讨论】:

  • 这个解决方案给了我一个错误的结果,n = 18446744073709551615(等于x86_64 框中的n = pow(2, 8 * sizeof(unsigned long))),因为在这种情况下log2(n) = 64+ 1 过多。改用bits = ceil(log2(n)) 有什么缺点吗?
  • 正如@selurvedu 指出的那样,尽管声称正确,但如果 n 是 2 的幂,则此答案是错误的。请改用 ceil(log2(n)) 。
  • @selurvedu, @superdweeble 你在说什么,为什么人们喜欢你的 cmets? Math.log2(16).ceil 等于4,但我们需要5,所以Math.log2(16).floor + 1 是对的。 Math.log2((1 << 64) - 1) 等于 64,因为精度不够。
  • @puchu 是对的,更喜欢答案,请不要再为前两个 cmets 投票
  • 这个答案是错误的。有关正确答案及其推导(证明),请参阅this answer below。例如,在 Python 中:bits_reqd_for_num = math.ceil(math.log2(num+1))
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    所以,

    2^b = 12345
    

    取双方的ln

    ln(2^b) = ln(12345)
    

    当然,数字对指数的对数是指数乘以仅底数的对数,所以,

    b*ln(2) = ln(12345)
    

    两边除以ln(2),

    b = ln(12345) / ln(2)
    

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

    所以,

    b = ceil(ln(12345) / ln(2))
    

    其中ceil(f)f 向上舍入到最接近的整数。

    使用上述过程,您可以使用任何日志库logb,即,找到任何数字N所需的位数,即,

    b = ceil(logb(N) / logb(2))
    

    【讨论】:

    • 请注意,如果您使用从 0 开始的整数,其中 000 对应于 0,111 对应于 7,则您实际上需要将 1 添加到此公式中。
    • 要明确@siemanko 的意思,请使用b = ceil(logb(N+1) / logb(2))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    相关资源
    最近更新 更多