我做了一个将数字转换成二进制的函数。由于某种原因,它不起作用。输出错误。输出为二进制格式,但是对于以零结尾的二进制数,它总是给出错误的结果(至少这是我注意到的。)

unsigned long long to_binary(unsigned long long x)
{
    int rem;
    unsigned long long converted = 0;

    while (x > 1)
    {
        rem = x % 2;
        x /= 2;
        converted += rem;
        converted *= 10;
    }

    converted += x;

    return converted;
}

请帮我修复它,这真令人沮丧。

谢谢!

最佳答案

  • 您正在反转位。
  • 终止循环时,不能将x的剩余部分用作指标。

  • 考虑例如4。

    在第一个循环迭代之后:
    rem == 0
    converted == 0
    x == 2
    

    在第二次循环迭代之后:
    rem == 0
    converted == 0
    x == 1
    

    然后将其设置为1。

    尝试:
    int i = sizeof(x) * 8; // i is now number of bits in x
    while (i>0) {
      --i;
      converted *= 10;
      converted |= (x >> i) & 1;
      // Shift x right to get bit number i in the rightmost position,
      // then and with 1 to remove any bits left of bit number i,
      // and finally or it into the rightmost position in converted
    }
    

    将x作为无符号字符(8位)使用值129(二进制10000001)运行上面的代码

    i = 8开头,无符号char * 8的大小。在第一个循环迭代中,i将为7。然后取x(129)并将其右移7位,得出值1。 1.下一次迭代,我们将converted乘以10(现在为10),然后将converted右移6位(值变为2),并将其与1(值变为0)进行与。我们对x进行0运算,然后仍为10。第3-7次迭代执行相同的操作,将converted乘以10,然后从converted中提取一个特定的位,然后将其进行OR'ed成为x。这些迭代之后,converted为1000000。

    在最后一次迭代中,第一个converted与10乘以10000000,我们将converted向右移0位,产生原始值129。我们将x与1相加,得到值1。然后将1进行OR'ed到x中,变为10000001。

    09-08 00:32