0

いくつかのマスクに従って、1 つのビットストリームを多数に分割できるInverse Multiplexerを作成する実験を行っています。

アイデア例はこちら

これは 24 ビット ストリームで、各文字が 1 ビットを表します。

abcdefgh ijklmnop qrstuvwx

3 つのマスクが与えられた場合、すべてのマスクに共通のビットはありません。& 一緒にすると [1,1,1,1,1,1,1,1] になります。

[1, 1, 0, 0, 1, 0, 0, 0]
[0, 0, 1, 0, 0, 0, 1, 1]
[0, 0, 0, 1, 0, 1, 0, 0]

これらのマスクを次のようにストリームに適用します

stream1 = ab__e___ ij__m___ qr__u___
stream2 = __c___gh __k___op __s___wx
stream3 = ___d_f__ ___l_n__ ___t_v__

したがって、元のビットストリームは次のように 3 つのビットストリームに分割されます。

stream1 = abeijmqru
stream2 = cghkopswx
stream3 = dflntv

上記は単なる例です。特定のビットストリームに任意の数のマスクを適用する必要があります。マスクは相互に保証されており、ゼロのOR結果があります。ANDすべてのマスクに適用すると、ONE の結果が得られます。すべてのマスクは同じ長さです。

私は、基本的にループ内でビットを 1 つずつシフトするアイデアを力ずくで実行するために、愚かなバージョンを作成しました。それは確かに効率的ではないと思いました。

私はこれを調べましたhttp://graphics.stanford.edu/~seander/bithacks.html

全く分からない。これを改善する方法を知っている人はいますか?(x86 マシン上)

4

2 に答える 2

1

各ビットが 1 つの出力ストリームにのみマップされる場合は、マスクを使用するよりも、ビットが割り当てられる出力ストリームを定義する方が理にかなっていると思います。たとえば、あなたの例のマスク

[1, 1, 0, 0, 1, 0, 0, 0]
[0, 0, 1, 0, 0, 0, 1, 1]
[0, 0, 0, 1, 0, 1, 0, 0]

代わりに、現在のビットを割り当てる出力ストリームとして表されます

[0, 0, 1, 2, 0, 2, 1, 1]

そして、それを結びつけるためのいくつかの疑似コード

stream_order = [0, 0, 1, 2, 0, 2, 1, 1]
index = 0
for bit in input_stream:
    n = stream_order[index]
    output_streams[n].push(bit)
    index++
    index %= len(stream_order)
于 2013-11-28T04:31:15.613 に答える