我做了一个将数字转换成二进制的函数。由于某种原因,它不起作用。输出错误。输出为二进制格式,但是对于以零结尾的二进制数,它总是给出错误的结果(至少这是我注意到的。)
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;
}
请帮我修复它,这真令人沮丧。
谢谢!
最佳答案
考虑例如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。