質問編集履歴

3

微調整

2018/08/12 02:34

投稿

HogeAnimalLover
HogeAnimalLover

スコア4830

test CHANGED
File without changes
test CHANGED
@@ -100,7 +100,9 @@
100
100
 
101
101
 
102
102
 
103
- xはワイルドカード、これを読み取って、初期化時には以下のようなリストがメモリ上に作っておきます。1バイトは8ビットですので、キーワード1ワードにつき8パターンが作られます。
103
+ xはワイルドカード、これを読み取って、初期化時には以下のようなリストがメモリ上に作っておきます。
104
+
105
+ 1バイトは8ビットですので、キーワード1ワードにつき8パターンが作られます。
104
106
 
105
107
 
106
108
 
@@ -108,7 +110,7 @@
108
110
 
109
111
  4 1 00010000 11010000
110
112
 
111
- 5 1 00001000     01101000
113
+ 5 1 00001000 01101000
112
114
 
113
115
  6 1 00000100 00110100
114
116
 

2

追記

2018/08/12 02:34

投稿

HogeAnimalLover
HogeAnimalLover

スコア4830

test CHANGED
File without changes
test CHANGED
@@ -76,4 +76,50 @@
76
76
 
77
77
 
78
78
 
79
+ キーワードファイルは以下のような形を想定、一行ずつ読み取って、リストを予め用意しておきます。実際は2000ワード弱ほどあり、1ワードは最大で2000ビット弱です。
80
+
81
+
82
+
83
+ word_number
84
+
85
+ length0 keyword0
86
+
87
+ length1 keyword1
88
+
89
+ ・・・
90
+
91
+
92
+
93
+
94
+
95
+
96
+
97
+ 1
98
+
99
+ 4 00x1
100
+
101
+
102
+
103
+ xはワイルドカード、これを読み取って、初期化時には以下のようなリストがメモリ上に作っておきます。1バイトは8ビットですので、キーワード1ワードにつき8パターンが作られます。
104
+
105
+
106
+
107
+ ビット長 バイト長 ビット列      マスク
108
+
109
+ 4 1 00010000 11010000
110
+
111
+ 5 1 00001000     01101000
112
+
113
+ 6 1 00000100 00110100
114
+
115
+ 7 1 00000010 00011010
116
+
117
+ 8 1 00000001 00001101
118
+
119
+ 9 2 00000000 10000000 00000110 10000000
120
+
121
+ 10 2 00000000 01000000 00000011 01000000
122
+
123
+ 11 2 00000000 00100000 00000001 10100000
124
+
79
125
  ```

1

追記

2018/08/12 02:28

投稿

HogeAnimalLover
HogeAnimalLover

スコア4830

test CHANGED
File without changes
test CHANGED
@@ -19,3 +19,61 @@
19
19
 
20
20
 
21
21
  これを使って多ビットを一斉計算できないか考えています。汎用レジスタ長までであれば、cのポインタキャストでいけそうですが、他に方法があればお教えください。
22
+
23
+
24
+
25
+
26
+
27
+ ### 以下追記
28
+
29
+
30
+
31
+ とりあえず、作りかけのプログラム案のイメージです。動作未確認
32
+
33
+ ```C
34
+
35
+ typedef char T;
36
+
37
+ //typedef long long T;
38
+
39
+ //多バイト一斉処理できるように、型はすぐ変えられるようにする。
40
+
41
+
42
+
43
+ int search(T targets[], T keyword[], T mask[], int target_size, int keyword_size)
44
+
45
+ {
46
+
47
+ for(int i = 0; i + keyword_size < target_size; i++){
48
+
49
+ for(int j = 0; j < keyword_size; j++){
50
+
51
+ if(mask[j] & (targets[i + j] ^ keyword[j]) ){
52
+
53
+ //相違ビットを検出した。外ループについてcontinueしたいが
54
+
55
+ //Cではラベル付きcontinue,breakが使えないので苦渋のgoto
56
+
57
+ goto label;
58
+
59
+ }
60
+
61
+ }
62
+
63
+ //targes[i]が検索にヒット
64
+
65
+ return i;
66
+
67
+ label:;//余談ですけど、この場合はgotoも悪くないと思います。
68
+
69
+ }
70
+
71
+ return -1;//検索ヒットせず
72
+
73
+ }
74
+
75
+
76
+
77
+
78
+
79
+ ```