二进制与BCD码转换

#define WORD_MSB(x)    *((unsigned char *)&x+1)
#define WORD_LSB(x)    *((unsigned char *)&x)


unsigned int saveBCD;//二进制数转换为压缩BCD数,结果存入saveBCD中


int BinToBcd(unsigned char val)
{
    unsigned char i,temp;


    saveBCD = 0;


    for(i=7;i>0;i--)
    {
        saveBCD <<= 1;


        if( val & 0x80 )
            WORD_LSB(saveBCD) |= 1;


        temp = WORD_LSB(saveBCD) + 0X03;
        if( temp & 0x08 )
            WORD_LSB(saveBCD) = temp;


        temp = WORD_LSB(saveBCD) + 0X30;
        if( temp & 0x80 )
            WORD_LSB(saveBCD) = temp;


        val <<= 1;
    }


    saveBCD <<= 1;
    if( val & 0x80 )
        WORD_LSB(saveBCD) |= 1;


    return saveBCD;
}


//压缩BCD数转换为二进制数,被转换的数不能大于255
unsigned char BcdToBin(unsigned int val)
{
    unsigned char temp,temp1,ret,shift;


    //计算百位   y*100 = y*64 + y*32 + y*4 = y<<6 + y << 5 + y<<1
    temp  = WORD_MSB(val);


    shift = 5;
    do{
        temp <<= 1;
    }while(--shift);//左移5位,乘以32


    temp1 = temp<<1; //再左移一位,相当于左移6位,乘以64


    ret = temp + temp1 + 
        ((WORD_MSB(val))<<1) + ((WORD_MSB(val))<<1);//左移2位,乘以4


    //计算10位 y*10 = y*8 + y*2 = y<<3 + y<<1
    temp = WORD_LSB(val) >> 4;


    temp1  = temp;
    shift = 3;
    do{
        temp1<<= 1;
    }while(--shift);//左移3位,乘以8


    //加上个位
    ret += temp1 + (temp<<1);


    //个位
    ret += (WORD_LSB(val) & 0x0f);    


    return ret;
}

你可能感兴趣的:(二进制与BCD码转换)