c - 在C中使用数组进行BCD转换

标签 c arrays visual-studio-2010 bcd

我正在开发一个项目,需要将一些长变量转换为 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。目前我只是在玩弄想法。我计划稍后将代码划分为函数。

最佳答案

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

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

关于c - 在C中使用数组进行BCD转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24916221/

相关文章:

C 系统 v 信号量未锁定关键区域

C: fgets 构建char*链表的用法

在 C 中将一个数组的元素复制到另一个数组

c - 在c中生成随机字符串

visual-studio-2010 - 将 TortoiseMerge 与 Visual Studio 和 TFS 结合使用 - 合并目标(未找到)

c - 左值需要作为一元 ‘&’ 操作数

c - 斯特林近似产生与预期不同的输出

javascript - 如何更改嵌套 JSON 对象中所有属性的值?

c# - Linq to SQL 背后的安全性

c++ - 错误 LNK2019 : unresolved external symbol _luaJIT_setmode