質問させてください。
**対象ビット列から、キーワードビット列の検索をしたいと考えています。**ここで、バイト内部のビットオフセットについては予めシフトパターンを用意して対応しています。専用命令を使って高速化できないかご教示ください。
私は以下の通りの方法を考えました。
対象ビット、キーワードビット、マスクビットをそれぞれ、t,k,mとします。論理式m and (t xor k)を計算することで、このビットに相違があるか判定します。これをビット長まで繰り返して、全てゼロとなったら検索にヒットしたとします。
この論理式は繰り上がり下がりがなく、他ビットに影響がないので一斉計算できると考えています。また、マスクビットを使うことで端数や中途ビットをワイルドカードにできます。
これを使って多ビットを一斉計算できないか考えています。汎用レジスタ長までであれば、cのポインタキャストでいけそうですが、他に方法があればお教えください。
以下追記
とりあえず、作りかけのプログラム案のイメージです。動作未確認
C
1typedef char T; 2//typedef long long T; 3//多バイト一斉処理できるように、型はすぐ変えられるようにする。 4 5int search(T targets[], T keyword[], T mask[], int target_size, int keyword_size) 6{ 7 for(int i = 0; i + keyword_size < target_size; i++){ 8 for(int j = 0; j < keyword_size; j++){ 9 if(mask[j] & (targets[i + j] ^ keyword[j]) ){ 10 //相違ビットを検出した。外ループについてcontinueしたいが 11 //Cではラベル付きcontinue,breakが使えないので苦渋のgoto 12 goto label; 13 } 14 } 15 //targes[i]が検索にヒット 16 return i; 17 label:;//余談ですけど、この場合はgotoも悪くないと思います。 18 } 19 return -1;//検索ヒットせず 20} 21 22 23キーワードファイルは以下のような形を想定、一行ずつ読み取って、リストを予め用意しておきます。実際は2000ワード弱ほどあり、1ワードは最大で2000ビット弱です。 24 25word_number 26length0 keyword0 27length1 keyword1 28・・・ 29 30 31例 321 334 00x1 34 35xはワイルドカード、これを読み取って、初期化時には以下のようなリストがメモリ上に作っておきます。 361バイトは8ビットですので、キーワード1ワードにつき8パターンが作られます。 37 38ビット長 バイト長 ビット列 マスク 394 1 00010000 11010000 405 1 00001000 01101000 416 1 00000100 00110100 427 1 00000010 00011010 438 1 00000001 00001101 449 2 00000000 10000000 00000110 10000000 4510 2 00000000 01000000 00000011 01000000 4611 2 00000000 00100000 00000001 10100000
回答4件
あなたの回答
tips
プレビュー