Int到二进制转换的解释

我的问题基于这篇文章: 十进制到二进制 ,它是选择的解决方案。

我可以让选择的答案代码工作,但它只适用于5位。 如何修改此代码以适用于更大的数字,比如8位?

我尝试将第一行中的字符偏移从5调整为8,但没有成功。

void getBin(int num, char *str) { *(str+5) = '\0'; int mask = 0x10 <>= 1) *str++ = !!(mask & num) + '0'; } 

并使用给定的代码进行测试,再次调整6到9以匹配上面的函数:

 int main() { char str[6]; getBin(10, str); printf("%s\n", str); return 0; } 

但输出仍然只显示前五位然后给出随机符号。 当我调整这些数字时,有人可以解释一下究竟发生了什么,这样我就可以将其用于8(或任何其他大小)位转换吗?

 void getBin(int num, char *str) { *(str+8) = '\0'; int mask = 0x80 << 1; while(mask >>= 1) *str++ = !!(mask & num) + '0'; } main() { char str[9]; getBin(254, str); printf("%s\n", str); return 0; } 

对于8位数字,您需要9个字符的数组。 您还需要更改掩码,因此它可以掩盖所有位。

对于像11111这样的5位数的最高有效位的掩码是10000 ,其等于16十进制或10hex。 对于8位数字也是如此。 面具是10000000 。 由于循环以mask >>= 1开始, mask >>= 1被移位1到左int mask = 0x10 << 1; 补偿。 因此,要将其修改为x-bit ,请定义x+1字符的数组。 将\0放在索引x 。 找到x-bit ,其中最重要的位为1 ,其他位为0 。 数字是2^(x-1) (2次幂(x-1))。

对不起,我不擅长英语。 您还需要调整局部变量’mask’。

 #include  void getBin(int num, char *str) { *(str+8) = '\0'; int mask = 0x80 << 1; while(mask >>= 1) *str++ = !!(mask & num) + '0'; } int main() { char str[9]; getBin(10, str); printf("%s\n", str); return 0; } 

我想解释为什么这段代码运行良好。 但是……我不擅长英语…我只是希望它有用/

接受答复后。

太多魔法数字。

在原始中,有常数0x10 ,它们没有显示与5位二进制数字的目标的关系。

然后当转到8时,使用常数0x10 。 由于未调整0x10 ,因此代码失败。

而是通过更一般的观点来解决问题,并使用消除或更好地表达这些神奇数字的代码。

 #define BitWidth 5 void getBin(int num, char *str) { int mask = 1 << (BitWidth - 1); // skip the original shift left and then immediately shift right do { *str++ = !!(mask & num) + '0'; } while (mask >>= 1); *str = '\0'; // by appending at the end, no need for a magic number } int main() { char str[BitWidth + 1]; getBin(10, str); printf("%s\n", str); return 0; } 

注意:当BitWidthint宽度匹配时,上述方法(和其他答案)有问题。 但这是使用unsigned数学轻松解决的另一个问题。