0

我正在做一个项目,我需要将一些长变量转换为 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”等效元素。我也单步执行了代码,发现在转换过程中没有填充其他元素。关于发生了什么的任何指导?

数组实现:

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。目前,我只是在玩弄想法。我计划在以后将代码划分为函数。

4

1 回答 1

0

这段代码看起来非常复杂。您只需要执行以下操作

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

试试这个Convert integer from (pure) binary to BCD

于 2014-07-23T16:48:35.527 回答