【问题标题】:Calculating bits required to store decimal number计算存储十进制数所需的位
【发布时间】:2011-11-01 06:39:46
【问题描述】:

这是一个我一直坚持的家庭作业问题。

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

i) 3 digits ii) 4 digits iii) 6 digits iv) n digits

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

提前致谢。

【问题讨论】:

  • 其实无符号整数的范围是 0 到 2^n - 1 为 n 位。
  • @rghome 这个属性有名字吗?我认为这很棒。
  • @Marwan 我不太确定你指的是什么属性,但也许“指数”是你要找的词。
  • 我说的是“无符号整数的范围是 0 到 2^n - n 位为 1”。这里需要的位数是 log_2 只是巧合吗?
  • 也许我疯了,算了。

标签: decimal unsigned unsigned-integer


【解决方案1】:

好吧,您只需计算每种情况的范围并找到高于该范围的 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。

【讨论】:

  • 那么,我需要 997 位来存储 3 位数字吗?是不是比特数太多了?
  • 9.97 位,而不是 997。但您确实需要 10,因为没有 .97 位这样的东西。
  • 嗯,这取决于您的语言环境,在葡萄牙,我们使用“,”作为小数点分隔符。无论如何,我将其更改为“。”在我的回答中。
  • 我相信正确的公式是floor(log2(n)) + 1,否则例如1024 的结果为 10,这是错误的。 Wikipedia link
  • @ubik 实际上,10 位足以表示 1024 个数字(0 到 1023)。当然如果你想知道代表一个特定数字的位数,那么这个公式是正确的。
【解决方案2】:

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

loge(n)/loge(2)

然后四舍五入。

例如,对于值 -128 到 127(有符号字节)或 0 到 255(无符号字节),整数的个数为 256,因此 n 为 256,由上式给出 8 .

对于0n,在上式中使用n + 1(有n + 1整数)。

在您的计算器上,loge 可能只是标记为 logln(自然对数)。

【讨论】:

  • 感谢您提供了一个简单的公式,而不是冗长的解释。更实用,更切中要害。
  • 如果我没记错的话,log₂(n) 应该可以正常工作。
  • 是的 - 如果您的计算器上有 log₂ 按钮。
  • @Isaac 人类需要解释,机器不需要推理。
【解决方案3】:

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

2N - 1 ≥ bn - 1
⇒ 2N ≥ bn

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

log2 2N ≥ log2 bn
⇒ N ≥ log2 bn
⇒ N ≥ log bn / log 2

由于我们想要满足最后一个关系的最小整数N,要找到N,找到log bn / log 2 拿下天花板。

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

对于 n = 3

N = ⌈3 / log10 2⌉ = 10

对于 n = 4

N = ⌈4 / log10 2⌉ = 14

对于 n = 6

N = ⌈6 / log10 2⌉ = 20

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

N = ⌈n / log10 2⌉

【讨论】:

  • 这是一个很好的答案。我建议指出 log(10^n) == n 以便读者避免计算大的中间数。
  • @wally -- 这是一个很好的收获。我不认为这些对数函数具有任何特定的基数,因为它们是成比例的,而 b 在推导中不一定是 10。在这里选择 base 10 的便利性刚刚引起了我的注意。注意log有时意味着log<sub>e</sub>ln;我在较早的数学参考文本中特别注意到了这一点。
  • 多么棒的解释。谢谢你。你的回答让我意识到我书中的解释是多么糟糕
  • @peter -- 谢谢。几年前我发布答案时,这个问题已经很老了;很高兴知道有人仍然觉得它有帮助;)
  • 这可以推广到任何基础 $q$ 到基础 $p$
【解决方案4】:

可以通过这种方式来概括您需要多少位来表示一个数字的技术。你有 R 个符号来表示,你想知道有多少位,求解这个方程 R=2^n 或 log2(R)=n。其中 n 是位数,R 是表示的符号数。

对于十进制数系统 R=9,所以我们求解 9=2^n,答案是每个十进制数字 3.17 位。因此,3 位数字需要 9.51 位或 10 位。1000 位数字需要 3170 位

【讨论】:

  • 对于十进制系统,R=10。 6 位数字需要 20 位,而不是 19 或 3.32 位/位。
【解决方案5】:

假设问题是询问您存储所需的最小位数是多少

  1. 3位数字

我对这个问题的回答是:

  • 我们需要存储的最大 3 位数字是多少?答:999
  • 存储此数字所需的最小位数是多少?

这个问题可以通过递归地将 999 除以 2 来解决。然而,使用数学的力量来帮助我们更简单。本质上,我们正在为以下等式求解 n:

2^n = 999
nlog2 = log999
n ~ 10

您需要 10 位来存储 3 位数字。

使用类似的方法解决其他子问题!

希望这会有所帮助!

【讨论】:

    【解决方案6】:

    继续将数字除以 2,直到商为 0。

    【讨论】:

      【解决方案7】:

      最简单的答案是将所需的值转换为二进制,然后查看该值需要多少位。但是,该问题询问十进制 X 位数有多少位。在这种情况下,您似乎必须选择 X 位的最大值,然后将该数字转换为二进制。

      作为一个基本示例,假设我们想要存储一个以 10 为基数的 1 位数字,并且想知道需要多少位。最大的 1 位以 10 为基数是 9,所以我们需要将其转换为二进制。这产生 1001,总共有 4 位。这个相同的示例可以应用于两位数(最大值为 99,转换为 1100011)。要解出 n 位数,您可能需要解出其他位数并搜索模式。

      要将值转换为二进制,您需要反复除以 2,直到商为 0(所有余数均为 0 或 1)。然后,您反转余数的顺序以获得二进制数。

      例如:13 到二进制。

      • 13/2 = 6 r 1
      • 6/2 = 3 r 0
      • 3/2 = 1 r 1
      • 1/2 = 0 r 1
      • = 1101 ((8*1) + (4*1) + (2*0) + (1*1))

      希望这会有所帮助。

      【讨论】:

      • 它适用于前两个问题,但是当您遇到接下来的两个问题时,它们已经足够大,可以通过您的方式解决。
      【解决方案8】:

      让它所需的 n 位然后 2^n=(base)^digit 然后取日志并计数。对于n

      【讨论】:

        【解决方案9】:

        对于 n 位数的二进制数,它可以容纳的最大十进制值是

        2^n - 1,而 2^n 是使用这些数字可以生成的总排列。

        以你只想要三位数的情况为例,即你的情况1。我们看到要求是,

        2^n - 1 >= 999

        将日志应用到双方,

        log(2^n - 1) >= log(999)

        log(2^n) - log(1) >= log(999)

        n = 9.964(大约)。

        取 n 的 ceil 值,因为 9.964 不能是有效的位数,我们得到 n = 10。

        【讨论】:

          【解决方案10】:

          这里有很多答案,但我会添加我的方法,因为我在解决同样的问题时发现了这篇文章。

          从我们这里知道的数字开始,从 0 到 16。

          Number           encoded in bits         minimum number of bits to encode
          0                000000                  1
          1                000001                  1
          2                000010                  2
          3                000011                  2
          4                000100                  3
          5                000101                  3
          6                000110                  3
          7                000111                  3
          8                001000                  4
          9                001001                  4
          10               001010                  4
          11               001011                  4
          12               001100                  4
          13               001101                  4
          14               001110                  4
          15               001111                  4
          16               010000                  5
          

          查看休息时间,它显示了这张表

          number <=       number of bits
          1               0
          3               2
          7               3
          15              4
          

          那么,现在我们如何计算模式?

          记住以 2 为底的对数 (n) = 以 10 为底的对数 (n) / 以 10 为底的对数 (2)

          number    logb10 (n)   logb2 (n)   ceil[logb2(n)] 
          1         0            0           0           (special case)
          3         0.477        1.58        2
          7         0.845        2.807       3  
          8         0.903        3           3           (special case)
          15        1.176        3.91        4
          16        1.204        4           4           (special case)
          31        1.491        4.95        5
          63        1.799        5.98        6
          

          现在所需的结果与第一个表匹配。请注意,某些值也是特殊情况。 0 和任何 2 的幂数。当您应用上限时,这些值不会改变,因此您知道需要加 1 才能获得 最小位域长度。

          为了解决特殊情况,请在输入中添加一个。在python中实现的结果代码是:

          from math import log
          from math import ceil
          def min_num_bits_to_encode_number(a_number):
              a_number=a_number+1  # adjust by 1 for special cases
          
              # log of zero is undefined
              if 0==a_number:
                  return 0
              num_bits = int(ceil(log(a_number,2)))  # logbase2 is available
              return (num_bits)
          

          【讨论】:

            【解决方案11】:

            这个有效!

            floor(loge(n) / loge(2)) + 1
            

            要包含负数,您可以添加一个额外的位来指定符号。

            floor(loge(abs(n)) / loge(2)) + 2
            

            【讨论】:

              【解决方案12】:

              简短的回答是:

              int nBits = ceil(log2(N));
              

              这仅仅是因为 pow(2, nBits) 比 N 略大。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-10-17
                • 2019-04-29
                • 2012-11-26
                • 1970-01-01
                • 1970-01-01
                • 2023-03-30
                • 1970-01-01
                • 2015-03-30
                相关资源
                最近更新 更多