知道10进制数,求2进制数的位数
Determine the number of digits of number in base 2 when you know the number in base 10
有人问我,当你知道一个以 10 为底数的数字时,确定一个以 2 为底数的数字有多少位数。
有什么方法可以在不将数字从 10 进制转换为 2 进制的情况下确定 2 进制数字的位数?
目前我只知道如何确定转换为基数 2 的数字的位数,只有当我计算基数 2 的数字时才知道。
谢谢!
继续从数字中提取位,直到最后得到零。
int ndigits(unsigned n)
{
int c=0;
while (n)
{
++c;
n >>= 1;
}
return c;
}
我可能错了,但是由于 n 位的二进制数可以表示最大 2n[=19 的十进制数=] - 1, 我猜十进制数 k 最多占 log2k + 1 位。
您可以使用对数进行此类计算:
int number_of_base_2_digits(int x)
{
return 1 + static_cast<int>(log2(x));
}
只要您在 double
中有足够的精度,这应该是精确的。
您可以将此方法扩展到任何基础
template<int Base>
int number_of_base_N_digits(int x)
{
return 1 + static_cast<int>(log(x)/log(Base));
}
但由于浮点运算的实现方式,运行 更容易解决精度问题。 IE。以上在我的机器上基本没问题,但是 returns 3 位 1000 以 3 为基数。
使用 math.h
提供的 log2。
numOfDigits = floor(log2(decimal_value) + 1);
因为这个问题被标记了c++我会尽量回答。
一个unsigned(不是2的补码)数n会占用std::floor(log2(k)) + 1
位来表示,也就是表示它所需的 重要 位数。
它将占用 所有 可用位的单词或您正在使用的单词倍数(如果为负数)。
有人问我,当你知道一个以 10 为底数的数字时,确定一个以 2 为底数的数字有多少位数。
有什么方法可以在不将数字从 10 进制转换为 2 进制的情况下确定 2 进制数字的位数?
目前我只知道如何确定转换为基数 2 的数字的位数,只有当我计算基数 2 的数字时才知道。
谢谢!
继续从数字中提取位,直到最后得到零。
int ndigits(unsigned n)
{
int c=0;
while (n)
{
++c;
n >>= 1;
}
return c;
}
我可能错了,但是由于 n 位的二进制数可以表示最大 2n[=19 的十进制数=] - 1, 我猜十进制数 k 最多占 log2k + 1 位。
您可以使用对数进行此类计算:
int number_of_base_2_digits(int x)
{
return 1 + static_cast<int>(log2(x));
}
只要您在 double
中有足够的精度,这应该是精确的。
您可以将此方法扩展到任何基础
template<int Base>
int number_of_base_N_digits(int x)
{
return 1 + static_cast<int>(log(x)/log(Base));
}
但由于浮点运算的实现方式,运行 更容易解决精度问题。 IE。以上在我的机器上基本没问题,但是 returns 3 位 1000 以 3 为基数。
使用 math.h
提供的 log2。
numOfDigits = floor(log2(decimal_value) + 1);
因为这个问题被标记了c++我会尽量回答。
一个unsigned(不是2的补码)数n会占用std::floor(log2(k)) + 1
位来表示,也就是表示它所需的 重要 位数。
它将占用 所有 可用位的单词或您正在使用的单词倍数(如果为负数)。