
8B1Q4の符号化をざっくり解釈
工事担任者の勉強をしていて8B1Q4の仕組みが気になったので調べてみました。何が気になったかというと、例えば、
「101010101(9ビット)」のようなビット列が、
どういう仕組みで「-1, 0, 1, 2」のような形式に変換されるのか
これが謎だったんです。
8B1Q4について理解するならこのサイト。2003年の記事ですが、1000BASE-Tが1999年の技術なので、現在理解するにも十分な解説です。
ただ、これだけ読んでも、なんで9ビットが4つになるの?って感じです。
そこで、こちらのサイト
これによると、どうやら9ビットを「とある表」を使って「-2, -1, 0, 1, 2」に変換しているようだということがわかりました。
じゃあ、その表を手に入れれば理解できるぞ!
ということで、「8B1Q4 変換表」などと検索してみるも、目当ての表にはヒットしません…。
規格として実現している以上、8B1Q4の変換表が存在しないはずがない!
では、なぜネット上で見つけられないのでしょうか。
その答えはWikipediaにありました。
そうです。ここで使用する表は4次元の表なんです。4次元なんて人間には把握できないですよね…。2次元の表で書けなくはないのですが、膨大になりすぎるので出回っていないのでしょう。
ということで、私が、表を作るわけではないですが、その変換表をイメージしながら、以下で解説を試みようと思います。
はじめに、データとして「101010101010101010101…」みたいな2進数の羅列が流れてきたとします。8B1Q4ではこれを8ビットずつ区切るので、ここから「10101010」を抜き出したとしましょう。これに、冗長ビット「1」をくっつけた「101010101」を変換していきます。
まず「101010101」の上位3ビットで変換表を選択します。この変換表ですが、3ビット使って1つの表を得ることから、「000」「001」「010」「011」「100」「101」「110」「111」の8つの表が存在することがわかります。今回は、そのうちの「101」の変換表を選択するということですね。

変換表を選択したら、残りの6ビットと、5値4組の組み合わせを見つけます。残りの6ビットは「010101」なので、これを10進数に直すと「21」。ということで、(イメージ)の表に照らし合わせると「+2, +1, -2 +1」が得られました。

5値4組で表せる情報は625通り。9ビットで表せる情報は512通りであるため、「-2, -1, 0, 1, 2」を4つ組み合わせれば、必ず一意の結果が得られるというわけです。
実際に使用されている8B1Q4の変換表は確認できませんが、中身の仕組みとしてはこんなイメージだと思います。