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

时间:2011-08-22 15:47:06

标签: decimal unsigned unsigned-integer

这是我一直困扰的家庭作业问题。

  

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

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

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

提前致谢。

12 个答案:

答案 0 :(得分:25)

嗯,你只需计算每个案例的范围,找到高于该范围的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位数是不够的,因为{{1} }小于1000)。

如果您对此进行概括,则可以:2^9=512

适用于i)给出:2^nbits=possibilities <=> nbits=log2(possibilities)并且因为位数必须是整数,所以你必须将它四舍五入为止。

答案 1 :(得分:6)

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

log e (n)/ log e (2)

< / p>

并向上舍入。

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

对于 0 n ,请在上面的公式中使用 n + 1 n + 1 整数)。

在您的计算器上, log e 可能只标有日志 ln (自然对数)。< / p>

答案 2 :(得分:4)

好的概括说明你需要多少比特来表示一个数字就是这样做的。你有R符号用于表示,你想知道有多少位,求解这个等式R = 2 ^ n或log2(R)= n。其中n是比特数,R是表示符号的数量。

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

答案 3 :(得分:2)

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

  

2 N - 1≥b n - 1
  ⇒2 N ≥b n

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

  

log 2 2 N ≥log 2 b n
  ⇒N≥log 2 b n
  ⇒N≥logb n / log 2

由于我们希望满足最后一个关系的最小整数 N ,要找到 N ,找到 log b n / log 2 并采取上限。

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

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⌉

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

作为一个基本的例子,我们假设我们想要存储1位十进制数,并想知道需要多少位。最大的1位数十进制数是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))

希望这会有所帮助。

答案 6 :(得分:0)

让它需要n位然后2 ^ n =(base)^ digit然后记录并计算no。为n

答案 7 :(得分:0)

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

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

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

2 ^ n - 1> = 999

将日志应用于双方

log(2 ^ n - 1)&gt; = log(999)

log(2 ^ n) - log(1)&gt; = log(999)

n = 9.964(约)。

从9.964开始取n的ceil值不能是有效的位数,我们得到n = 10.

答案 8 :(得分:0)

假设问题是询问存储

所需的最小位数
  1. 3位数
  2. 我对这个问题的处理方法是:

    • 我们需要存储的3位数的最大数量是多少?答案:999
    • 我存储此号码所需的最小位数是什么?

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

    2^n = 999
    nlog2 = log999
    n ~ 10
    

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

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

    希望这有帮助!

答案 9 :(得分:0)

这里有很多答案,但是我会在处理同样的问题时发现这篇文章后添加我的方法。

从我们所知道的开始是从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

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

请记住,log base 2(n)= log base 10(n)/ log base 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)

答案 10 :(得分:0)

这一个有效!

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

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

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

答案 11 :(得分:0)

简短的答案是:

int nBits = ceil(log2(N));

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