INTEL厨 vs AMD厨 Part34

このエントリーをはてなブックマークに追加
965 ◆Rb.XJ8VXow
問題の解答をする前に少し考察をしておく。

1) first = (((code - 0x5f00) >> 1) & 0x7f00) ^ 0xe000;
2) c1[0] = ((c1[0] + 1) >> 1) + ((c1[0] < 0x5f) ? 0x70 : 0xb0);

1)のコードと2)のコードを見比べてみよう。
どちらも右シフトを行うことにより上位コードを1/2(切り捨て)にしている。
ここで2)では、値を1/2(切り捨て)にする前に基値に1を加えている。
これは、jisコードの開始が奇数値から始まる為そのまま1/2(切り捨て)にすると
0x21と0x22の1/2(切り捨て)の結果が異なる問題の補正を行っている。
つまり、(奇数偶数)をグループ化したい為に1を加え(偶数奇数)に変換して
1/2(切り捨て)を行うことで同一の商を得ている訳だ。
これは1)のコードでも同じで(code-0x5f00)は(code-0x5e00 - 0x0100)という事だ。