任意の数値をBCDに変換する / double dabbleアルゴリズムと少しインチキな方法と / Python

# 普通に10進数の1桁ずつを取り出す。
def bin2bcd(_bin):
    DIGITS_BCD = len(str(_bin))
    bcd = [0] * DIGITS_BCD
    for i in range(DIGITS_BCD - 1):
        _bin, bcd[i] = divmod(_bin, 10)
    bcd[DIGITS_BCD - 1] = _bin
    return bcd

# double_dabbleアルゴリズムでBCDに変換する。        
def bin2bcd_dubdab(_bin):
    DIGITS_BCD = len(str(_bin))
    BITS_BCD   = DIGITS_BCD * 4
    
    bcd = 0
    for i in range(BITS_BCD - 1, 0, -1):
        bcd = bcd << 1 | (_bin >> i & 1)
        for j in range(BITS_BCD, -1, -4):
            if (bcd >> j & 0xF) > 4:
                bcd += 3 << j
    return (bcd << 1) | (_bin & 1)
        
    
val = 123456789000999
print(bin2bcd(val))
print(hex(bin2bcd_dubdab(val)))

# 少しインチキだがこれが簡単。
print(hex(eval("0x" + str(val))))

f:id:ti-nspire:20210426165656p:plain