BCD
Binary-Coded Decimal
2進化10進表現
37
0b00100101
0x25
16進数なので10進数と表記が合わない
10進数の各位を4ビットの2進数で表して、16進数表示する 0011 0111とすると3 7となって表記が合う
繰り上がりをいい感じに処理すると、この表示のまま演算できる
内部演算をBCDによる2進数で行って16進数で表示すると、10進数での表示と一致するのがうれしい?あんも.icon
実装して確かめてみるあんも.icon
繰り上がりの判定は実態にあっているかわからない
左側の繰り上げのフラグを立てて返すと2桁以上の計算もできそう
code:jl
function bcd_split(bcd::UInt8)
right = bcd & 0b0000_1111
left = (bcd >> 4) & 0b0000_1111
return left, right
end
function bcd_correction(sum::UInt8)
if sum >= 0x0a
sum -= 0x0a
return sum, true # 繰り上げフラグ
else
return sum, false
end
end
function add_bcd(a::UInt8, b::UInt8)
left_a, right_a = bcd_split(a)
left_b, right_b = bcd_split(b)
right_sum = right_a + right_b
right_corrected, carry_right = bcd_correction(right_sum)
left_sum = left_a + left_b + (carry_right ? 0b0001 : 0b0000)
left_corrected, _ = bcd_correction(left_sum)
return (left_corrected << 4) | right_corrected
end
function test_bcd(a = 0x19, b = 0x01)
bcd_result = add_bcd(a, b)
nomal_result = a + b
println(string(bcd_result, base=16))
println(string(nomal_result, base=16))
end
test_bcd(0x19, 0x01)