十进制到二进制-For循环以反向模式打印二进制



关于代码应该做什么以及我正在实现什么的背景。因此,dec2bin函数应该从数组dec_nums[]={0,1,77159165530987654321}中获得十进制值/数字;

该函数应该将值转换为二进制数并打印出来。转换是正确完成的但是,它向后打印二进制文件

有人能帮我弄清楚问题出在哪里吗,或者是否有其他方法可以达到正确的结果?

int main() {
int dec_nums[] = {0, 1, 77, 159, 65530, 987654321};
int i;
printf("=== dec2bin ===n");
for (i = 0; i < sizeof(dec_nums) / sizeof(int); i++)
dec2bin(dec_nums[i]);
return 0;
}
void dec2bin(int num) {
int saveNum = num;
if (saveNum == 0) {
printf("nBinary Number of %d", saveNum);
printf(" = 0");
} else {
int number;
int i;
printf("nBinary Number of %i", saveNum);
printf(" = ");
for (i = 0; num > 0; i++) {
number = num % 2;
num = num / 2;
printf("%i", number);
}
printf("n");
}
}

由于位篡改无符号类型是首选类型,您可以避免由于欠/溢出而导致的任何类型的未定义行为问题。

除此之外,您还可以对位掩码进行操作:

for(unsigned mask = 1u << sizeof(mask) * CHAR_BIT - 1; mask; mask >>= 1)
{
unsigned bit = (value & mask) != 0;
// print it
}

CHAR_BIT是一个字符中的比特值,来自标头limits.h,通常(但不一定(它是8,int通常有四个字节。您将掩码初始化为1 << 31,然后进一步向下移动,直到它到达1 << 0,即1,这是最后一个考虑的值。另一个移位将单个位集移出mask,因此得到0,循环中止。

上面的代码将打印前导零,如果你想跳过它们,你可以准备另一个循环,只需向下移动,直到满足第一个1位。

该变体从最高有效位开始;通过% 2,你总是得到最低有效位——这就是为什么你得到了相反的顺序。

旁注:获取数组的长度最好用sizeof(array)/sizeof(*array)来完成——如果您需要更改数组的基本类型,这可以避免错误。。。

一个简单的解决方案是从数组末尾开始向char数组中写入位,这与我们手动执行的方式相同

您的dec2bin函数将变为(只有最小的更改,添加或更改的行带有注释(:

void dec2bin(int num)

{
// declare a char array of size number_of_bits_in_an_int + 1 for the terminating null
char bin[sizeof(int) * CHAR_BIT + 1];
char* ix = bin + sizeof(bin) - 1;  // make ix point to the last char
*ix-- = '';                      // and write the terminating null
int saveNum = num;
if (saveNum == 0)
{
printf("nBinary Number of %d", saveNum);
printf(" = 0");
}
else
{
int number;
int i;
printf("nBinary Number of %i", saveNum);
printf(" = ");
for (i = 0; num > 0; i++)
{
number = num % 2;
num = num / 2;
*ix-- = '0' + number;   // just write the bit representatin
}

printf("%sn", ix+1);  //print the binary representation

}


}

这足以得到预期的结果。

最新更新