我的问题基于这篇文章:Decimal to Binary及其选择的解决方案。
我可以让所选择的答案代码正常工作,但它只适用于5位。如何修改此代码以适用于更大的数字,比如8位?
我尝试将第一行中的字符偏移量从5调整为8,但没有成功。
void getBin(int num, char *str)
{
*(str+5) = '\0';
int mask = 0x10 << 1;
while(mask >>= 1)
*str++ = !!(mask & num) + '0';
}
并使用给定代码进行测试,再次调整6到9以匹配上述函数:
int main()
{
char str[6];
getBin(10, str);
printf("%s\n", str);
return 0;
}
但输出仍然只显示前五位然后给出随机符号。当我调整这些数字时,有人可以解释一下究竟发生了什么,这样我就可以将其用于8(或任何其他大小)的位转换吗?
答案 0 :(得分:1)
我不擅长英语,抱歉。 你需要调整局部变量&#39; mask&#39;太
#include <stdio.h>
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;
}
我想解释为什么这段代码运行良好。 但... 我不擅长英语...... 我希望它有用/
答案 1 :(得分:0)
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
十六进制。
对于8位数字也是如此。掩码是10000000
。由于循环以mask >>= 1
开始,因此掩码会向左移动int mask = 0x10 << 1;
以进行补偿。
因此,要为x-bit
数字修改它,请定义x+1
个字符数组。将\0
放在索引x
。查找x-bit
个数字,其中最重要的位为1
,其他位数为0
。数字为2^(x-1)
(2次幂(x-1))。
答案 2 :(得分:0)
接受回答后。
太多魔术数字。
在原文中,常量5
,0x10
,6
没有显示与5
二进制数字编号的目标的关系。
然后,当转到8时,使用常量8
,0x10
,9
。由于未调整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
数学轻松解决的另一个问题。