-4

imuint32_t16進数をuint32_tBCD番号に変換します。そして、BCDへのuint64hexに対しても同じことを行います。

私はuint16からこれを持っています

uint16_t CvtBcd(uint16_t HexNumber)
{
  return ((HexNumber/ 10) << 4) | (HexNumber% 10); 
}

編集:

より大きなプログラムで使用する外部コードとして使用します。

// Converts a uint32_t hex number into uint32_t BCD number.
extern uint32_t Cvt32Bcd(uint32_t HexNumber)
{
  return ((HexNumber/10) << 8 | (HexNumber % 10));
}
4

1 に答える 1

2

2進化10進表現では、10進数ごとに4ビットが必要であるため、すべての(符号なし)整数を同じサイズのBCD表現に変換することはできません。通常、そのためにはより大きな型が必要です。その問題を無視すると、任意のサイズの符号なし整数をそのBCD表現に変換するアルゴリズムは次のようになります。

uintN_t convert_to_BCD(uintN_t n) {
    uintN_t bcd = 0;
    int shift = 0;
    while(n) {
        bcd |= (n % 10) << shift;
        n /= 10;
        shift += 4;
    }
    return bcd;
}

オーバーフローを回避するには、戻り型を引数型よりも大きくしますが、もちろん、使用可能な最大の入力型では機能しません。次に、の配列を使用して数字を保持するか、2つのsをunsigned char含む構造体を使用して結果を保持することができます。uintN_t

于 2012-07-30T12:25:01.870 に答える