web-dev-qa-db-ja.com

BCDを10進数に変換する方法は?

2進化10進数を表現の観点から10進数に変換するにはどうすればよいですか?私はそれの値を変換したくはありませんが、むしろそれの表現です、これが私が意味することです。

0x11を10進数の1117ではない)に変換し、0x202032ではない)に変換したい。

unsigned char day = 0x11;
unsigned char month = 0x12;

int dayDecimal, monthDecimal;

DayDecimalを11、monthDecimal = 12にします。私は0x00から0x60の範囲で作業するので、それが可能であるはずです。 「A」、「B」、「C」、「D」、「E」、「F」はありません。

更新:

私は実際に、取り組んでいる組み込みプロジェクトの一部としてRTCCチップから時間を読み取っています。時間、分、日、月はその形式で返されます。たとえば、分が0x40の場合、64ではなく40分を意味するため、その解釈を正しく維持できる必要があります。どういうわけか、0x40を64ではなく40に変換する必要があります。それが可能であることを願っています。

ありがとう!

6
Ammar

2つのニブルを操作して、重要度の高いニブルに10を掛け、重要度の低いものを追加する必要があります。

uint8_t hex = 0x11;
assert(((hex & 0xF0) >> 4) < 10);  // More significant nybble is valid
assert((hex & 0x0F) < 10);         // Less significant nybble is valid
int dec = ((hex & 0xF0) >> 4) * 10 + (hex & 0x0F);

アサーションが無効になっているが、入力が偽物(0xFFなど)の場合、GIGO —ガベージイン、ガベージアウトに値するものが得られます。これを(インライン)関数に簡単にラップできます。

static inline int bcd_decimal(uint8_t hex)
{
    assert(((hex & 0xF0) >> 4) < 10);  // More significant nybble is valid
    assert((hex & 0x0F) < 10);         // Less significant nybble is valid
    int dec = ((hex & 0xF0) >> 4) * 10 + (hex & 0x0F);
    return dec;
}       

この変換はBCDを彷彿とさせます— 2進化10進数

13

エラーチェックのない非常に簡単な方法:

int bcd_to_decimal(unsigned char x) {
    return x - 6 * (x >> 4);
}
5
chqrlie

関数に目的の値を入力すると、整数が返されます。

#include <stdio.h>
#include <math.h>

typedef int                 INT32;

typedef short int           INT16;

typedef unsigned short int  UINT16;

typedef unsigned long int   UINT32;

UINT32 BCDToDecimal(UINT32 nDecimalValue){
    UINT32 nResult=0;
    INT32  nPartialRemainder, ncnt,anHexValueStored[8];
    UINT16 unLengthOfHexString = 0,unflag=0;

    for(ncnt=7 ;ncnt>=0 ; ncnt--){
        anHexValueStored[ncnt]=nDecimalValue & (0x0000000f << 4*(7-ncnt));
        anHexValueStored[ncnt]=anHexValueStored[ncnt] >> 4*(7-ncnt);
        if(anHexValueStored[ncnt]>9)
        unflag=1;
    }
    if(unflag==1){
        return 0;
    }
    else{
        for(ncnt=0 ;ncnt<8 ; ncnt++)
        nResult= nResult +anHexValueStored[ncnt]*pow(10,(7-ncnt));
        return nResult;
    }
}
int main() {
    printf("%ld\n",BCDToDecimal(0X20));
    return 0;
}
1
kavya gupta