hh4a

  • (by K, 2020.07.05)

(0)

  • ごく一部の人は、OSECPU-VMが非常にうまくいったのは、hh4エンコードが絶妙だったからだと知っています。
  • これをさらに発展させたものをES-VMのために作ってみました。

(1) Lv1 (hh4相当)

ビット表現エンコード長表現可能範囲(16進数)俗称
0xxx4bit0-60型
10xx_xxxx8bit0-3f8型
110x_xxxx_xxxx12bit0-1ffC型
1110_xxxx...xxxx16bit0-fffE型
1111_1110_xxxx...xxxx20bit0-fffFE型
0111_0100_xxxx...xxxx24bit0-ffff74型
0111_0101_xxxx...xxxx28bit0-fffff75型
0111_0110_xxxx...xxxx32bit0-ffffff76型
0111_1000_0110_xxxx...xxxx36bit0-ffffff786型
0111_1000_0111_xxxx...xxxx40bit0-fffffff787型
  • 以下略

  • ビッグエンディアン
  • 先頭に7があると拡張モードになり、「データ部のビット数/4」がLv1のhh4aで記述される。
  • 拡張モードでのビット数指定部分のhh4aがさらに拡張モードであってもよい(でも以下に示す通り、それを許さなくてもあまり支障はない)。
    • 入れ子はどれだけ深くなっても構わないが、ただハードウェアで実装することを考える場合はある程度の制約はあったほうがいいかもしれない。
    • 拡張モードを全く許さないと、fff(12bit)までしか表現できない。
    • 拡張モードを一段だけ許すと、16380bitまで表現できる。これでほとんどの場合は十分ではないか。そうであれば、入れ子形式は原則として許さなくてもいいかもしれない。
  • 先頭のFはpadding用で意味がない(例:FE型)。Fは連続でいくつ並べてもよい。ただし拡張モードの中のhh4aにはパディングのFは使用しない。
    • それはLv2で使用する。

  • 基本的にデータ部のビット長の長いエンコード方法は、それより短いものの上位互換になっており、「あえて短い形式を選ばなければ表現できない数値がある」ということはない。
    • だから値に応じてフォーマットを変えることなく、固定長でエンコードしていくことが可能であり、エンコーダ側の簡素化が可能になっている。

(2) Lv2

  • このレイヤで、負の数や、少し出現頻度の高い特別なデータをより短い形式で表現する。
    7F_0負の数プリフィクス
    7F_10x200Lv1よりも4bit短い
    7F_20x3ffLv1よりも4bit短い
    7F_30x400Lv1よりも4bit短い
    7F_40x7ffLv1よりも4bit短い
    7F_50x800Lv1よりも4bit短い
    7F_60xfffLv1よりも4bit短い
    7F_870x1000Lv1よりも8bit短い
    7F_880x1fffLv1よりも8bit短い
    7F_890x2000Lv1よりも8bit短い
    7F_8A0x3fffLv1よりも8bit短い
    7F_8B0x4000Lv1よりも8bit短い
    7F_8C0x7fffLv1よりも8bit短い
    7F_8D0x8000Lv1よりも8bit短い
    7F_8E0xffffLv1よりも8bit短い
    7F_8F0x10000Lv1よりも12bit短い
  • 以下略

  • ルール: 7Fを検出したら、Lv1でのリードをする。そして読み取った値をiとする。
    iが1以上であれば、デコード値=(0x200 << (i >> 1)) - ((i ^ 1) & 1)。
    iが0であれば、さらにもう一度Lv2でのリードをする。それをjとすると、デコード値=~j。
    • Lv2でのリードをするため、たとえば 7F0_7F1 は、 ~0x200 になる。

  • 負の数プリフィクスが12bitにもなるところが唯一の心残り。しかし本当に負の数の出現頻度は小さいので、まあ何とかなりそうな気もする。
  • 8bit形式の3fを使用禁止にして、これを負の数プリフィクスにするアイデアもある。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-07-06 (月) 01:17:17 (38d)