Использование массивов для преобразования BCD в C

Вопрос:

Я работаю над проектом, где мне нужно преобразовать некоторые длинные переменные в BCD.

У меня уже есть код, который работает, но я чувствую, что его можно улучшить…

void main(void){
unsigned long input = 0;
unsigned long convert = 0;
float convert2 = 0;
char buffer[200];
unsigned char Ones, Tens, Hundreds, Thousands, TenThousands, HundredThousands;

printf("Input:   ");
scanf("%d", &input);

convert = input*12;
convert2 = input * 0.0001224896;

BCD(convert, &Ones, &Tens, &Hundreds, &Thousands, &TenThousands, &HundredThousands);
sprintf(buffer, "%d%d%dKG", HundredThousands, TenThousands, Thousands);

printf("\n\nInputted: %d", input);
printf("\nADC Conversion: %d", convert);
printf("\nBCD Conversion: %s", buffer);
printf("\nFloat Conversion: %f", convert2);

getchar();
getchar();
}

void BCD (unsigned long Pass, unsigned char *Ones, unsigned char *Tens, unsigned char *Hundreds, unsigned char *Thousands, unsigned char *TenThousands, unsigned char *HundredThousands){

unsigned char temp1, temp2, temp3, temp4, temp5, temp6;
unsigned int count = 0;

*Ones = 0;
*Tens = 0;
*Hundreds = 0;
*Thousands = 0;
*TenThousands = 0;
*HundredThousands = 0;
temp1 = 0;
temp2 = 0;
temp3 = 0;
temp4 = 0;
temp5 = 0;
temp6 = 0;

for(count = 0; count <= 31; count++){
if (*Ones >= 5){
*Ones = (*Ones + 3)&0x0F;
}
if (*Tens >= 5){
*Tens = (*Tens + 3)&0x0F;
}
if (*Hundreds >= 5){
*Hundreds = (*Hundreds + 3)&0x0F;
}
if (*Thousands >= 5){
*Thousands = (*Thousands + 3)&0x0F;
}
if (*TenThousands >= 5){
*TenThousands = (*TenThousands + 3)&0x0F;
}
if (*HundredThousands >= 5){
*HundredThousands = (*HundredThousands + 3)&0x0F;
}

temp1 = (Pass & 2147483648) >> 31;
temp2 = (*Ones & 8) >> 3;
temp3 = (*Tens & 8) >> 3;
temp4 = (*Hundreds & 8) >> 3;
temp5 = (*Thousands & 8) >> 3;
temp6 = (*TenThousands & 8) >> 3;

Pass = Pass << 1;
*Ones = ((*Ones << 1) + temp1) & 15;
*Tens = ((*Tens << 1) + temp2) & 15;
*Hundreds = ((*Hundreds << 1) + temp3) & 15;
*Thousands = ((*Thousands << 1) + temp4) & 15;
*TenThousands = ((*TenThousands << 1) + temp5) & 15;
*HundredThousands = ((*HundredThousands << 1) + temp6) & 15;


printf("\n\nLoop: %d\nOnes:             %d\n", count, *Ones);
printf("Tens:             %d\n", *Tens);
printf("Hundreds:         %d\n", *Hundreds);
printf("Thousands:        %d\n", *Thousands);
printf("TenThousands:     %d\n", *TenThousands);
printf("HundredThousands: %d\n",*HundredThousands);
}
}

Проблема, с которой я сталкиваюсь, заключается в том, что она кажется беспорядочной и неэффективной. Я думал, что вместо использования нескольких переменных для каждого блока BCD (Ones, Tens и т.д.) Я мог бы использовать массивы для выполнения одного и того же процесса. Я реализовал это в коде, но у меня есть несколько проблем. Кажется, что в коде отображается эквивалентный элемент “Ones”. Я также прошел через код и обнаружил, что другие элементы не заполняются во время процесса преобразования. Любые указания относительно того, что происходит?

Реализация массива:

void main(void){
unsigned long input = 0;
unsigned long convert = 0;
char buffer[200];
unsigned char BCD_Units[6];
unsigned char temp[6];
unsigned int count = 0;
unsigned int count1 = 0;
unsigned char buff_store = 0;
unsigned char buff_store2 = 0;

printf("Input:   ");
scanf("%d", &input);

convert = input;

memset(temp, 0, sizeof(temp));
memset(BCD_Units, 0, sizeof(BCD_Units));

for(count = 0; count <= 31; count++){
for (count1 = 0; count1 < 6; count1++){
if (BCD_Units[count1] >= 5){
buff_store = BCD_Units[count1];

buff_store = ((buff_store + 3) & 15);

BCD_Units[count1] = buff_store;
}
}

temp[0] = (convert & 2147483648) >> 31;
for (count1 = 0; count1 < 5; count1++){
buff_store = BCD_Units[count1];

temp[(count+1)] = (buff_store & 8) >> 3;
}

convert = convert << 1;
for(count1 = 0; count1 < 6; count1++){
buff_store = BCD_Units[count1];
buff_store2 = temp[count1];

buff_store = ((buff_store << 1) + buff_store2) & 15;

BCD_Units[count1] = buff_store;
temp[count1] = buff_store2;
}

printf("\n\nLoop: %d\nOnes:             %d\n", count, BCD_Units[0]);
printf("Tens:             %d\n", BCD_Units[1]);
printf("Hundreds:         %d\n", BCD_Units[2]);
printf("Thousands:        %d\n", BCD_Units[3]);
printf("TenThousands:     %d\n", BCD_Units[4]);
printf("HundredThousands: %d\n", BCD_Units[5]);
}

sprintf(buffer, "%d%d%dKG", BCD_Units[5], BCD_Units[4], BCD_Units[3]);
printf("\n\nInputted: %d", input);
printf("\nBCD Conversion: %s", buffer);

getchar();
getchar();
}

PS. В настоящий момент я просто играю с идеями. Я планирую разделить код на функции на более поздний срок.

Ответ №1

этот код кажется чрезвычайно сложным. Вам просто нужно сделать следующее

make a buffer
loop till n = 0
get n % 10 (get digit)
or digit into left or right nibble of curretn buffer byte (need a toggle for left or right)
increment buffer pointer if filled left nibble
n = n / 10

попробуйте преобразовать целое число из (чистого) двоичного кода в BCD

Оцените статью
TechArks.Ru
Добавить комментарий