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
十进制或10
hex。 对于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; }
注意:当BitWidth
与int
宽度匹配时,上述方法(和其他答案)有问题。 但这是使用unsigned
数学轻松解决的另一个问题。