hh4a
(0)
- ごく一部の人は、OSECPU-VMが非常にうまくいったのは、hh4エンコードが絶妙だったからだと知っています。
- これをさらに発展させたものをES-VMのために作ってみました。
(1) Lv1 (hh4相当)
ビット表現 | エンコード長 | 表現可能範囲(16進数) | 俗称 | 0xxx | 4bit | 0-6 | 0型 | 10xx_xxxx | 8bit | 0-3f | 8型 | 110x_xxxx_xxxx | 12bit | 0-1ff | C型 | 1110_xxxx...xxxx | 16bit | 0-fff | E型 | 1111_1110_xxxx...xxxx | 20bit | 0-fff | FE型 | 0111_0100_xxxx...xxxx | 24bit | 0-ffff | 74型 | 0111_0101_xxxx...xxxx | 28bit | 0-fffff | 75型 | 0111_0110_xxxx...xxxx | 32bit | 0-ffffff | 76型 | 0111_1000_0110_xxxx...xxxx | 36bit | 0-ffffff | 786型 | 0111_1000_0111_xxxx...xxxx | 40bit | 0-fffffff | 787型 |
- ビッグエンディアン
- 先頭に7があると拡張モードになり、「データ部のビット数/4」がLv1のhh4aで記述される。
- 拡張モードでのビット数指定部分のhh4aがさらに拡張モードであってもよい(でも以下に示す通り、それを許さなくてもあまり支障はない)。
- 入れ子はどれだけ深くなっても構わないが、ただハードウェアで実装することを考える場合はある程度の制約はあったほうがいいかもしれない。
- 拡張モードを全く許さないと、fff(12bit)までしか表現できない。
- 拡張モードを一段だけ許すと、16380bitまで表現できる。これでほとんどの場合は十分ではないか。そうであれば、入れ子形式は原則として許さなくてもいいかもしれない。
- 先頭のFはpadding用で意味がない(例:FE型)。Fは連続でいくつ並べてもよい。ただし拡張モードの中のhh4aにはパディングのFは使用しない。
- 基本的にデータ部のビット長の長いエンコード方法は、それより短いものの上位互換になっており、「あえて短い形式を選ばなければ表現できない数値がある」ということはない。
- だから値に応じてフォーマットを変えることなく、固定長でエンコードしていくことが可能であり、エンコーダ側の簡素化が可能になっている。
(2) Lv2
- このレイヤで、負の数や、少し出現頻度の高い特別なデータをより短い形式で表現する。
7F_0 | 負の数プリフィクス | | 7F_1 | 0x200 | Lv1よりも4bit短い | 7F_2 | 0x3ff | Lv1よりも4bit短い | 7F_3 | 0x400 | Lv1よりも4bit短い | 7F_4 | 0x7ff | Lv1よりも4bit短い | 7F_5 | 0x800 | Lv1よりも4bit短い | 7F_6 | 0xfff | Lv1よりも4bit短い | 7F_87 | 0x1000 | Lv1よりも8bit短い | 7F_88 | 0x1fff | Lv1よりも8bit短い | 7F_89 | 0x2000 | Lv1よりも8bit短い | 7F_8A | 0x3fff | Lv1よりも8bit短い | 7F_8B | 0x4000 | Lv1よりも8bit短い | 7F_8C | 0x7fff | Lv1よりも8bit短い | 7F_8D | 0x8000 | Lv1よりも8bit短い | 7F_8E | 0xffff | Lv1よりも8bit短い | 7F_8F | 0x10000 | Lv1よりも12bit短い |
- 以下略
- 負の数プリフィクスが12bitにもなるところが唯一の心残り。しかし本当に負の数の出現頻度は小さいので、まあ何とかなりそうな気もする。
- 8bit形式の3fを使用禁止にして、これを負の数プリフィクスにするアイデアもある。
|