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

时间:2009-06-07 16:57:14

标签: algorithm binary decimal

主要问题:有多少位?

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

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

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

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

7 个答案:

答案 0 :(得分:6)

b 中写入 n 需要 ceiling(log base b(n))位。

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

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

答案 1 :(得分:5)

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

Y = ln((B^X)-1) / ln(C) + 1

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

Y = X * ln(B) / ln(C) + 1

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

答案 2 :(得分:5)

我之前的回答中有一个错误:看看Ben Schwehn的评论。 对于这种困惑感到抱歉,我发现并解释了我在上面的答案中所犯的错误。

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

Y = ln(P^n) / ln(Q)
Y = n * ln(P) / ln(Q)

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

我没有答案(不会转换数字并且在临时变量中占用那么多空间)以获得给定数字1000(bin)= 8(dec)的最小值,而你保留2使用此公式的小数位。

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

len(str(int(otherBaseStr,P)))

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


错误回答:

如果你有一个长度为n的P数字系统中的数字 然后,您可以计算n个字符中可能的最高数字:

P^(n-1)

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

log((P^(n-1))/log(Q)
(n-1)*log(P) / log(Q)

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

(8-1)*log(2) / log(10) = 2.1 digits (round up to 3)

原因是错误的

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

(P^n) - 1

不是

P^(n-1)

答案 3 :(得分:1)

使用其他答案给出的公式计算数字位数,但是,实际上可以更快地首先分配最大大小的缓冲区,然后返回该缓冲区的相关部分而不是计算对数。

请注意,当您转换为二进制时,缓冲区大小的最坏情况会发生,这为32位整数提供了32个字符的缓冲区大小。

Converting a number to an arbitrary base可以使用下面的C#函数完成(代码在其他语言中看起来非常相似,如C或Java):

public static string IntToString(int value, char[] baseChars)
{
    // 32 is the worst cast buffer size for base 2 and int.MaxValue
    int i = 32;
    char[] buffer = new char[i];
    int targetBase= baseChars.Length;

    do
    {
        buffer[--i] = baseChars[value % targetBase];
        value = value / targetBase;
    }
    while (value > 0);

    char[] result = new char[32 - i];
    Array.Copy(buffer, i, result, 0, 32 - i);

    return new string(result);
}

答案 4 :(得分:0)

答案 5 :(得分:0)

查看对数基数P和基数Q.向下舍入到最接近的整数。

对数基数P可以使用您最喜欢的基数(10或e)计算:log_P(x)= log_10(x)/ log_10(P)

答案 6 :(得分:0)

您需要分别计算小数部分的长度。

对于二进制到十进制,存在与位数一样多的十进制数字。例如,二进制0.11001101001001为十进制0.80133056640625,小数点后均为14位数。

对于十进制到二进制,有两种情况。如果小数部分是dyadic,那么有多少位作为十进制数字(与上面的二进制到十进制相同)。如果分数不是二元的,则位数是无限的。

(您可以使用我的decimal/binary converter对此进行试验。)