conta = 16;
oper3 = 0;
oper = 10;
oper2 = 15;
for(i=0;i<16;i++)
{
esadecimale[i] = 0;
}
for(i=0;i<16;i++)
{
binario[i] = 0;
}
esadecimale[10] = 'A';
esadecimale[11] = 'B';
esadecimale[12] = 'C';
esadecimale[13] = 'D';
esadecimale[14] = 'E';
esadecimale[15] = 'F';
printf("Inserisci il numero esadecimale da convertire (4 inserimenti): ");
for(i=4;i>0;i--)
{
scanf("%s",&esadecimale[i]);
}
while(oper3 < 4)
{
if(esadecimale[oper3] < 10)
{
oper = esadecimale[oper3];
while(oper > 0)
{
conta--;
oper2 = oper % 2;
binario[conta] = oper2;
oper = oper / 2;
}
}
else
{
while(!(esadecimale[oper3]==esadecimale[oper]))
{
oper++;
}
while(oper > 0)
{
conta--;
oper2 = oper % 2;
binario[conta] = oper2;
oper = oper / 2;
}
}
oper = 10;
oper3++;
}
printf("Il numero esadecimale convertito in binario e': ");
for(i=0;i<16;i++)
{
printf("%i",binario[i]);
}
此代码应该将十六进制数转换为二进制数。 我尝试使用-for循环而不是&#34;而(oper3&lt; 4)&#34;但它并没有解决问题。
如果我输入F F F F,我得到的输出就像0000 0000 0000 1111 0000 0000 0000 1011如果输入A B C D
我猜它只会转换第二个十六进制字符并且位置错误。
如果可能的话,我想要的解决方案并不需要超出您在此代码中看到的知识,因为练习明确指出只能使用数组,谢谢。< /强>
答案 0 :(得分:0)
你的代码太复杂而且在某些地方没有任何意义(例如,你有很多代码行来初始化esadecimale
然后用scanf()
覆盖其中一些代码。你没有做出区分在ASCII数字和整数之间,因此while
循环运行时间过长:
oper = esadecimale[oper3]; // contains '1' = 49 = 110001 binary
while(oper > 0) // loops seven times instead of once!
你的&gt; = 10的情况不应该与你的&lt; 10个案例。这是一个解决这些问题的重写:
void esadecimale_a_binario() {
char esadecimale[4];
printf("Inserisci il numero esadecimale da convertire (4 inserimenti): ");
for (int i = 3; i >= 0; i--)
{
scanf("%c", &esadecimale[i]);
}
int binario[16] = { 0 };
int conta = 15;
int oper3 = 0;
while (oper3 < 4)
{
int oper;
if (esadecimale[oper3] < 10)
{
oper = esadecimale[oper3] - '0';
}
else
{
oper = esadecimale[oper3] - 'A' + 10;
}
while (oper > 0)
{
int oper2 = oper % 2;
binario[conta--] = oper2;
oper /= 2;
}
oper3++;
}
printf("Il numero esadecimale convertito in binario e': ");
for (int i = 0; i < 16; i++)
{
printf("%i", binario[i]);
}
printf("\n");
}
但是,如果您要使用scanf()
,请通过它%x
输入选项让它为您服务。然后,进行一些奇偶校验测试很简单:
#define CONTA 16
void esadecimale_a_binario() {
printf("Inserisci il numero esadecimale da convertire (4 inserimenti): ");
unsigned esadecimale;
(void) scanf("%4x", &esadecimale);
printf("Il numero esadecimale convertito in binario e': ");
int binario[CONTA] = { 0 };
for (int i = 0; i < CONTA; i++)
{
int j = CONTA - i - 1;
binario[j] = esadecimale % 2;
esadecimale /= 2;
}
for (int i = 0; i < CONTA; i++)
{
printf("%i", binario[i]);
}
printf("\n");
}
以这种方式使用scanf()
也会使十六进制数字不区分大小写。这个子程序可以更简单(没有数组,更少的循环等),但我已经将它限制在您原始代码中已经使用过的功能。
<强> TEST 强>
% ./a.out
Inserisci il numero esadecimale da convertire (4 inserimenti): ABCD
Il numero esadecimale convertito in binario e': 1010101111001101
%