010101...や0011001100...などの正確に等しい繰り返しバイナリパターンである128ビットのグループをすばやくスキャンするにはどうすればよいですか?
128ビットブロックの数があり、1の数が0の数に等しいパターンに一致するかどうかを確認したいと思います。たとえば、010101....または00110011...または0000111100001111...ですが、001001001ではありません。 ..
問題は、パターンが境界で開始しない可能性があるため、パターン00110011 .. 0110011 ...で始まり、1ビットシフトで終了することです(128ビットは循環していないため、開始は結合されません。終わり)
010101 ...ケースは簡単で、単純に0xAAAA...または0x5555...です。ただし、パターンが長くなると、順列も長くなります。現在、この質問で概説されているような繰り返しシフト値を使用しています。ビットストリーム内のビットパターンをスキャンする最速の方法ですが、このルーチンですべてのCPUの70%を使用しているため、もっと速い方法がいいでしょう。他のポスターには一般的なケースの解決策がありますが、私のパターンの対称的な性質がより最適なものにつながることを願っています。
それが役立つ場合、私は最大63ビット長のパターンにのみ関心があり、2つのパターン(0101 ... 00110011 ... 0000111100001111 ...など)の累乗に最も関心がありますが、5つの1/5のゼロなどのパターンは現在、これらの非累乗2シーケンスは0.1%未満であるため、一般的なケースをより迅速に進めるのに役立つ場合は無視できます。
完璧なソリューションを実現するためのその他の制約は、アセンブラ命令の数が少なく、ランダムなメモリアクセスがないことです(つまり、大きなレインボーテーブルは理想的ではありません)。
編集。より正確なパターンの詳細。
私は主に、各パターンが128ビット内で連続的に繰り返される0011と0000,1111と0000,0000,1111,1111と16zeros/onesと32zeros/ ones(コンマのみ)のパターンに興味があります。繰り返し部分の長さが2、4、8、16、32ビットでないパターンはそれほど面白くなく、無視できます。(例:000111。。。)
スキャンの複雑さは、パターンが01または10トランジションだけでなく、任意の位置から開始する可能性があることです。したがって、たとえば、次のすべては00001111の4ビット繰り返しパターンに一致します...(読みやすさのために4ビットごとにコンマ)(省略記号は同じように繰り返すことを意味します)
0000,1111....または0001,1110...または0011,1100...または0111,1000...または1111,0000...または111,0001...または1100,0011...または1000,0111
128ビット内では、同じパターンを繰り返す必要があります。2つの異なるパターンが存在することは重要ではありません。たとえば、これは有効なパターンではありません。0000,1111,0011,0011...4ビットの繰り返しから2ビットの繰り返しに変更したため。
1の数が64であることをすでに確認しました。これは、すべての2乗パターンに当てはまります。次に、繰り返しパターン(2、4、8、16、32)を構成するビット数と、パターンの量を特定する必要があります。シフトしました。たとえば、パターン0000,1111は4ビットパターンで、0シフトされます。0111,1000...は4ビットパターンで3シフトされます。