teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

微調整

2018/08/12 02:34

投稿

HogeAnimalLover
HogeAnimalLover

スコア4853

title CHANGED
File without changes
body CHANGED
@@ -49,11 +49,12 @@
49
49
  1
50
50
  4 00x1
51
51
 
52
- xはワイルドカード、これを読み取って、初期化時には以下のようなリストがメモリ上に作っておきます。1バイトは8ビットですので、キーワード1ワードにつき8パターンが作られます。
52
+ xはワイルドカード、これを読み取って、初期化時には以下のようなリストがメモリ上に作っておきます。
53
+ 1バイトは8ビットですので、キーワード1ワードにつき8パターンが作られます。
53
54
 
54
55
  ビット長 バイト長 ビット列      マスク
55
56
  4 1 00010000 11010000
56
- 5 1 00001000     01101000
57
+ 5 1 00001000 01101000
57
58
  6 1 00000100 00110100
58
59
  7 1 00000010 00011010
59
60
  8 1 00000001 00001101

2

追記

2018/08/12 02:34

投稿

HogeAnimalLover
HogeAnimalLover

スコア4853

title CHANGED
File without changes
body CHANGED
@@ -37,4 +37,27 @@
37
37
  }
38
38
 
39
39
 
40
+ キーワードファイルは以下のような形を想定、一行ずつ読み取って、リストを予め用意しておきます。実際は2000ワード弱ほどあり、1ワードは最大で2000ビット弱です。
41
+
42
+ word_number
43
+ length0 keyword0
44
+ length1 keyword1
45
+ ・・・
46
+
47
+
48
+
49
+ 1
50
+ 4 00x1
51
+
52
+ xはワイルドカード、これを読み取って、初期化時には以下のようなリストがメモリ上に作っておきます。1バイトは8ビットですので、キーワード1ワードにつき8パターンが作られます。
53
+
54
+ ビット長 バイト長 ビット列      マスク
55
+ 4 1 00010000 11010000
56
+ 5 1 00001000     01101000
57
+ 6 1 00000100 00110100
58
+ 7 1 00000010 00011010
59
+ 8 1 00000001 00001101
60
+ 9 2 00000000 10000000 00000110 10000000
61
+ 10 2 00000000 01000000 00000011 01000000
62
+ 11 2 00000000 00100000 00000001 10100000
40
63
  ```

1

追記

2018/08/12 02:28

投稿

HogeAnimalLover
HogeAnimalLover

スコア4853

title CHANGED
File without changes
body CHANGED
@@ -8,4 +8,33 @@
8
8
 
9
9
  この論理式は繰り上がり下がりがなく、他ビットに影響がないので一斉計算できると考えています。また、マスクビットを使うことで端数や中途ビットをワイルドカードにできます。
10
10
 
11
- これを使って多ビットを一斉計算できないか考えています。汎用レジスタ長までであれば、cのポインタキャストでいけそうですが、他に方法があればお教えください。
11
+ これを使って多ビットを一斉計算できないか考えています。汎用レジスタ長までであれば、cのポインタキャストでいけそうですが、他に方法があればお教えください。
12
+
13
+
14
+ ### 以下追記
15
+
16
+ とりあえず、作りかけのプログラム案のイメージです。動作未確認
17
+ ```C
18
+ typedef char T;
19
+ //typedef long long T;
20
+ //多バイト一斉処理できるように、型はすぐ変えられるようにする。
21
+
22
+ int search(T targets[], T keyword[], T mask[], int target_size, int keyword_size)
23
+ {
24
+ for(int i = 0; i + keyword_size < target_size; i++){
25
+ for(int j = 0; j < keyword_size; j++){
26
+ if(mask[j] & (targets[i + j] ^ keyword[j]) ){
27
+ //相違ビットを検出した。外ループについてcontinueしたいが
28
+ //Cではラベル付きcontinue,breakが使えないので苦渋のgoto
29
+ goto label;
30
+ }
31
+ }
32
+ //targes[i]が検索にヒット
33
+ return i;
34
+ label:;//余談ですけど、この場合はgotoも悪くないと思います。
35
+ }
36
+ return -1;//検索ヒットせず
37
+ }
38
+
39
+
40
+ ```