从一个数字系统转换到另一个数字系统后将有多少位数

2 algorithm binary decimal

主要问题:多少位数?

让我解释.我在二进制系统中有一个数字:11000000,十进制是192.

转换为十进制后,它将具有多少位数(以二进制形式)?在我的例子中,它是3位数.但是,这不是问题.我通过互联网搜索,找到了一个用于积分部分的算法和一个用于小数部分的算法.我不太了解他们,但(我认为)他们的作品.

当从二进制转换为八进制时,它更容易:每个3位在八进制中给出1位数.十六进制相同:每个4位= 1个十六进制数字.

但是,我很好奇,该怎么办,如果我在P数字系统中有一个数字并想将它转换为Q数字系统?我知道怎么做(我想,我知道:)),但是,首先,我想知道Q系统中需要多少位数(你不,我必须预先分配空间).

Jay*_*uzi 6

在基数b中n天花板(log base b(n))数字.

您注意到的比率(八进制/二进制)是log base 8(n)/ log base 2(n)= 3.

(从记忆中,它会坚持吗?)


Pau*_*lin 5

如果你有一个基数为B的X位数字,那么可以表示的最大值是B ^ X - 1.所以如果你想知道它可能在基数C中需要多少位数,那么你必须找到数字Y表示C ^ Y - 1至少与B ^ X - 1一样大.这样做的方法是取B ^ X-1的基数C中的对数.并且由于基数C中的数字的对数(log)与该数字的自然对数(ln)除以C的自然对数相同,因此变为:

Y = ln((B^X)-1) / ln(C) + 1
Run Code Online (Sandbox Code Playgroud)

并且因为ln(B ^ X)是X*ln(B),并且这可能比ln(B ^ X-1)计算得更快并且足够接近正确答案,所以将其重写为

Y = X * ln(B) / ln(C) + 1
Run Code Online (Sandbox Code Playgroud)

用你最喜欢的语言翻译.因为我们放弃了"-1",所以在某些情况下我们可能会比你需要的数字多一个数字.但更好的是,您可以预先计算ln(B)/ ln(C)并将其乘以新的"X"并且您尝试转换的数字的长度会发生变化.


Jor*_*lob 5

我之前的回答中有一个错误:看看Ben Schwehn的评论.对不起,我发现并解释了我在上面的答案中所犯的错误.

请使用Paul Tomblin提供的答案.(改写为使用P,Q和n)

Y = ln(P^n) / ln(Q)
Y = n * ln(P) / ln(Q)
Run Code Online (Sandbox Code Playgroud)

所以Y(向上舍入)是系统Q中需要的字符数,表示可以在系统P中以n个字符编码的最高数字.

我没有答案(不会转换数字并占用临时变量中的那么多空格)以获得给定数字1000(bin)= 8(dec)的最小值,而您将保留2个小数位这个公式.

如果临时内存使用不是问题,您可能会欺骗并使用(Python):

len(str(int(otherBaseStr,P)))
Run Code Online (Sandbox Code Playgroud)

这将为您提供将基数P转换为字符串(otherBaseStr)转换为小数所需的小数位数.


错的回答:

如果您有一个长度为n的P数字系统中的数字,那么您可以计算出n个字符中可能的最大数字:

P^(n-1)
Run Code Online (Sandbox Code Playgroud)

要在数字系统Q中表示此最高数字,您需要使用对数(因为它们与取幂相反):

log((P^(n-1))/log(Q)
(n-1)*log(P) / log(Q)
Run Code Online (Sandbox Code Playgroud)

例如,二进制的11000000是8个字符.要在Decimal中获取它,您需要:

(8-1)*log(2) / log(10) = 2.1 digits (round up to 3)
Run Code Online (Sandbox Code Playgroud)

原因是错的:

n个字符中可能的最大数字是

(P^n) - 1
Run Code Online (Sandbox Code Playgroud)

P^(n-1)
Run Code Online (Sandbox Code Playgroud)

  • 看起来在公式(n-1)*log(P)/ log(Q)中你使用n来表示在基数P时的字符数.我担心这是不正确的.例如二进制11.1111.1111 - > n = 10 - >(10-1)*log(2)/ log(10)= 2.7 - >向上 - > 3.但是11.1111.1111是十进制的1023,需要*4*小数,不是3! (2认同)