知道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));
}

demo

只要您在 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 为基数。

demo

使用 math.h 提供的 log2

numOfDigits = floor(log2(decimal_value) + 1);

Live demo.

因为这个问题被标记了我会尽量回答。

一个unsigned(不是2的补码)数n会占用std::floor(log2(k)) + 1位来表示,也就是表示它所需的 重要 位数。

它将占用 所有 可用位的单词或您正在使用的单词倍数(如果为负数)。