ハーフビットを使用する方法はありますか?


19

ここでほとんどの人が知っているように、4ビットを使用することで、0〜15(16進数の0123456789ABCDEF)をカウントできます。しかし、9までしかカウントしない場合、4ビットを使用することになり、AからFまでの数字は無駄になります。

ただし、ウィキペディアのQRコードページでは、0〜9の数字のみを使用する場合は文字ごとに3ビットを使用するようになっています。これは統計的な観点から正しいです。さらに、ビットの3分の1は物理的なオブジェクトではなく、0〜9の数値を送信する場合、少なくとも4ビットが使用されます。

無駄な組み合わせを使用して、ビットの端数を持つ文字を効果的に送信する方法はありますか?

OK、例を挙げましょう。2桁の「27」を送信する必要があります。通常のコーディング技術では、送信されるビットは00100111になります。次に、次のビットに応じて、数字「2」を数字「E」または「F」に置き換えるシステムを想像できます。この場合、次のビットは0なので、「2」は「E」に置き換えられます。結果のビット列は1101 0 111になります。一方、数字「28」を送信する必要がある場合、「2」の後の最初のビットは1なので、代わりに数字「F」に置き換えられます。文字列1111 1 000 を生成します。

どちらの場合も、1つのニブルが2つの異なる文字に使用されたため、1ビットの経済性が達成されました。つまり、各文字に3ビット半ビットが使用されます。


2
より小さい桁スペースでの値のパッキングに関する別の観点については、Ternaryコンピューター(en.wikipedia.org/wiki/Ternary_computer)を確認してください。Knuthに十分であれば、私にも十分です!
RLH 14年

3
それを計算して(10 * first_digit) + second_digit、0 ... 99を表す7ビットにエンコードし、コード100-127を他のものに残しておくことができることを認識した方が良いでしょう。さらに、3桁を10ビットに圧縮するとさらに節約できます。
ホットリックス14年

100種類の値すべてを個別に送信するには、7ビットにパックするのが最善です。より多くの桁がある場合、パッキングはより効率的になります。あなたはわずか6ビット使用してそれを送ることができます送信するために64の未満の値を持っている場合
phuclv

回答:


22

半分のビットを送信することはできませんが、送信または保存する前に2つの半分のビットを1ビットに効果的にパックできます。

自分で例を挙げているので、自分の質問に事実上YESで答えています。

多少簡単な方法は、2つの10進数の値を7ビットで単純にエンコードすることです。(バイナリコードのデュアル10進数の並べ替え)。


1
数字のペアを7ビットにパックするための便利な使用例の1つは、ほとんど数字のデータで構成されるASCIIファイルを送信する場合です。128未満のバイト値は1つのASCII文字を表し、128〜227は2つのASCII数字を表します。エンコードまたはデコードが簡単で、データにほとんど数字(または任意の数字)が含まれている必要はありませんが、数字の文字列を50%で非常に簡単に圧縮できます。
supercat

または1で16ビットに3個の文字の英数字を詰めPDP11の形式が...スペアビットということ
ブライアン・ドラモンド

@BrianDrummond:16ビットを使用して、40のセットから正確に3文字、または39のセットから最大3文字を格納できますが、予備のビットはありません。通常、「英数字」は少なくとも36のセットを意味しますが、スペアビットがある唯一の方法は、セットが32に制限されている場合です。
supercat14年

5ビット/文字だと思いました。英数字は2つのコードセットに分割され、1つのシンボルは「スイッチコードセット」用に予約されていました。私は間違っていました:en.wikipedia.org/wiki/DEC_Radix-50気味が悪いが、CP / Mシステムで8インチフロッピーで誰かが私に与えたレポートを解読しなければならなかったとき、暗闇だけでそれを見たZ80 asmの回想
ブライアンドラモンド14年

19

ハフマンコーディングを使用して、数字のビット長を変えることができます。他の数字よりも頻繁に発生する数字を知っている場合に役立ちます。

例(同じ出現回数):

0〜1111

1〜1110

2〜110

3〜101

4〜100

5-011

6-010

7-001

8〜000

番号1を取得するための受信側の例:

最初のビットが入り、オプションとして0〜4のみが残ります。

2番目のビットが入り、オプションとして0〜2だけが残ります。

3番目のビットが入り、オプションとして0〜1を残します。

4番目のビットが入り、着信番号は1です


12

おそらくあなたが探しているのは算術コーディングです。これは、原則としてそれぞれが小数(非整数)のビット数を必要とするシンボルの文字列を効率的にエンコードできます。(ただし、メッセージの合計は整数ビットでなければなりません)

Wikipediaの引用:

算術符号化は、ハフマン符号化などの他の形式のエントロピー符号化とは異なり、入力をコンポーネントシンボルに分けてそれぞれをコードに置き換えるのではなく、算術符号化はメッセージ全体を単一の数値、分数nに符号化します(0.0≤n < 1.0)。


10

浮動小数点演算用の新しいIEEE P754は、バイナリに加えて10進形式を定義するようになりました。エンコードの1つでは、デジタル数字を3で10ビットにグループ化することを提案しています。

10ビット= 1024の可能性のあるコードを使用して0から999をエンコードすることは非常に効率的であり、10進数は多くの場合3でグループ化されます。

密集した10進数:http : //en.wikipedia.org/wiki/Densely_packed_decimal


10進数字が3でグループ化されている場合でも、正しい10進浮動小数点セマンティクスでは、次のいずれかが必要になる場合があります。(2)一部のビットは、(指数mod 3)に応じて、数値の上部または下部のいずれかに使用できます。(3)指数が1000を基数として格納されている場合、3桁の下のグループを、最も近い単位ではなく、最も近い10または100に丸める必要がある場合があります。
supercat

私は個人BigDecimal的に、各単語が32ビットではなく9桁の10進数を保持している場合、多くの目的でより効率的であると考えていますが、丸め動作は数字のグループ化の影響を受けません。
supercat 14年

4

バイナリ(または16進数)の1:1対応は、ビットの1つのシンボルエンコーディングです。はい、あなたが示したように、それは可能です。これが使用されるもう1つの場所は、ビットトランジションがデコードを容易にするためにさらに離れた状態に保たれる通信システムのトレリスエンコード/デコードです。そしてもちろん、8b / 10bや64b / 66bなどのエンコードも同様のアイデアで、サブバンドでDCバランス、シンボル分離、制御コードを取得するために、小さなシンボルスペースを少し冗長な大きなスペースでエンコードします。


4

データ表現は、あなたまたはあなたのプログラムがそれに与える解釈に依存します。

たとえば、「27」をASCII文字として送信することもできます0x3237 = 0b0011001000110111

xn(x)log2n(x)

バツ1バツ2nバツ1nバツ2ログ2nバツ1+ログ2nバツ2ログ2nバツ1nバツ2

2ログ210=24=8ログ21010=7

それは常にアプリケーションに依存しますが、通常、提案されたように変数を「結合」する場合、これらの変数に対して操作を実行したい場合、より多くの計算能力が必要になります。「結合された」変数に対する演算の加算と減算は通常よりも複雑であり、ハードウェアにより多くのスペースが必要になるか、遅延が長くなる可能性があります。



2

値をパックする通常の方法は、各値にその範囲を乗算することです。そのため、ビットで効率的に表現できる1つの大きな数値になります。展開すると、範囲で除算され、残りは数字になり、結果は残りのパックされた数字になります。

0〜2の範囲の5つの値がある場合、各値に2ビットを使用する単純な方法で使用される10ビットの代わりに、8ビットで表すことができます(値を表すには少なくとも7.92ビットが必要です)。 (((n 1 * 3 + n 2)* 3 + n 3)* 3 + n 4)* 3 + n 5


このエンコード方法に名前はありますか?
キーガンジェイ

1

理論的には、高インピーダンス検出器に回路スペースと電力を費やすことを希望する場合、デジタルワイヤに3つの状態(1、0、および高Z)を送信できます。免責事項:これはシミュレータでうまく機能します。回路に、通常のゲートのペアほど速く切り替わらないなど、実用的でない問題があるかどうかはわかりません。

高Zから信号への信号遷移の通常の用語(信号は通常シリコンで接地されます)は、ハーフビット信号です。


1

3ビットを必要とする1桁の10進数を送信したい。ただし、3分の1ビットを送信できないため、4ビットを使用する必要があります。

そのため、3ビットが実際に何を意味するのかを知るには、それぞれ3ビットの2桁(または3桁)が必要です。0から9までの2桁の10進数を送信する場合は、それぞれが3ビットよりわずかに小さい必要がありますが、7ビットを使用して送信できます。構成的証明は簡単です:

7(10)ビットを使用すると、0〜128(1023)の数値をエンコードできます-ただし、必要なのは00(000)〜99(999)のみです。QED


1

リンクされたウィキの記事で何を意味しているのか誤解していると思います。意味するものは、(スペース、カンマ、またはピリオドなし)完全に数値の文字列のために、理想的な圧縮を使用して、あなたは3を使用して各文字を表現できるということである1 / 3ビット平均を。実際には、長期的にはlog 2(10)= 3.3219ビット/文字を取得できると計算されているため、これよりも少し優れています。

同様に、英数字といくつかの記号(大文字のみ、および9記号)、または45文字のセットの場合、ログ2(45)= 5.4918ビット/文字が必要です。これは記事では5.5に切り上げられます。

削減されたビット/文字は、プリセットエンコーディングまたはQR規格で指定された圧縮方式のいずれかで圧縮を使用して実現されます(どちらが使用されるかはわかりません)。文字をエンコードするために必要な平均ビット数を表すため、個々の文字は多かれ少なかれビットを使用してエンコードされます。また、上記の値が無限のランダムな文字列の理想的な値であることを理解してください。特別に細工された文字列に対して、より良いまたはより悪い圧縮率を取得することが可能です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.