>>965のつづき
さて、ここで1)のコードは何故0x5fを引いているのかが気になるところだろう。
これはsjisのマップが上位コード0x81-9Fと0xE0-FFに分かれてことへの対応だ。
2)の式の後半で(c1[0] < 0x5f)を条件とした3項式があることに注目して欲しい。
元値の0x5e(0x5f)を境にsjisのマップは分割されているのである。
では、何故codeから0x5f00を引くのだろうか?
引いた結果が負になるものと正になるものに分けると答えが見えて来るはずだ。
負になるもの=0x2121-0x5E7E 引いた後の値=0xFFFF C221-0xFFFF,FFFE
正になるもの=0x5F21-0x7E7E 引いた後の値=0x0000 0021-0x0000,1F7E
に分けられる。
補数となった結果が後で0x7f00との論理積(最上位bitを除く上位コードの切り出し)と
0xE000との排他ORにより0x81〜0x9Fへと変換されているのです。
ここで、最上位bitは0x7f00との論理積により常に0となることを覚えていてください。(注