主要问题:有多少位?
让我解释一下。我在二进制系统中有一个数字:11000000,十进制是192。
转换为十进制后,它将具有多少位数(以二进制形式)?在我的例子中,它是3位数。但是,这不是问题。我通过互联网搜索,找到了一个用于积分部分的算法和一个用于小数部分的算法。我不太了解它们,但(我认为)它们有效。
当从二进制转换为八进制时,它更容易:每个3位在八进制中给出1位数。十六进制相同:每个4位= 1个十六进制数字。
但是,我很好奇,该怎么办,如果我在P数字系统中有一个数字并想将它转换为Q数字系统?我知道怎么做(我想,我知道:)),但是,首先,我想知道Q系统中需要多少位数(不,我必须预先分配空间)。
答案 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)
这里的关键字是“logarithm”,这里有一些暗示性链接:
http://www.adug.org.au/MathsCorner/MathsCornerLogs2.htm
http://staff.spd.dcu.ie/johnbcos/download/Fermat%20material/Fermat_Record_Number/HOW_MANY.html
答案 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对此进行试验。)