INTEL厨 vs AMD厨 Part34

このエントリーをはてなブックマークに追加
990 ◆Rb.XJ8VXow
ほんじゃ解答を書く。(笑

1)0x5f00を引いているのは何故だ?
3項式を使わずに0x81-9Fと0xE0-EFへ変換する為、sjisのマップ境界である0x5f
を引くことにより補数値と正値に分けている。

2)0x5f00より大きな数字でも他の値を変えれば無問題?
1)の解により0x5f以外はダメである。

3)右に1bitシフトしているのは何故だ?
sjisの下位バイトの範囲がjisの丁度2倍になる為、2:1=>1:2へ変換している。
但し、jisのコードが奇数より開始されていることに注意しシフト前に奇数値の定数
を加算しておく必要がある。

4)0x7f00と論理積は何の為だ?
0xE000との排他ORの結果最上位bitが必ず1(0x80以上)になるようにする為。
これによりマップ開始位置0x8nに変換されている。

5)0xE0で排他ORしている理由を述べよ。
0xE0は0x80と0x60の合成結果であり目的が異なる。
0x80は前記した0x7fとの組み合わせで変換結果が0x80以上になるように変換する為である。
0x60は補数値と整数値をそれぞれ[ ?11? => ?00? ]、[ ?00? => ?11? ]へ変換している。合成すると
0x80は補数値と整数値をそれぞれ[ 011? => 100? ]、[ 000? => 111? ]へ変換している。

6)上位バイトに付いてsjisはxA0〜xDFの分断があるが、それをどのような考え方で実装しているか述べよ。
sjisの分断位置がjisの上位コードの0x5e(5f)であることを考慮してそこを境界に
補数と整数に変換し0x6を排他ORすることで実装している。
尚、変移幅が0x4(第2-3bitの変換)であるsjisだからこそ可能であり最初から
そのように仕組まれたマップである。