回答編集履歴
8
間違いがあるので非表示
answer
CHANGED
@@ -1,155 +1,7 @@
|
|
1
|
-
|
1
|
+
#※間違いがあるので参考リンク以外を非表示にしておきます。
|
2
2
|
|
3
|
-
2以上の判定を行う例
|
4
|
-
27桁のソースに対して必要なマスクとの論理演算を行います。
|
5
|
-
`000000000000000100011010001`
|
6
|
-
`010010010010010010010010010`
|
7
|
-
|
8
|
-
分解イメージ
|
9
|
-
`000 000 000 000 000 100 011 010 001`
|
10
|
-
`010 010 010 010 010 010 010 010 010`
|
11
|
-
AND演算
|
12
|
-
`000 000 000 000 000 000 010 010 000`
|
13
|
-
結果のONビットのものをbitsetのcountでカウントする。
|
14
|
-
|
15
|
-
その他条件でも論理演算を数回組み合わせてマスクでふるいにかける感じで計算出来そうです。
|
16
|
-
とりあえず>=1,==2,>=2は数えられました。
|
17
|
-
合計は全要素操作するしかないと思われるので割愛します。
|
18
|
-
|
19
3
|
---
|
20
|
-
|
21
4
|
参考:[ビット演算](https://c.keicode.com/cpp/bitwise-operations.php)
|
22
5
|
|
23
6
|
|
24
|
-
参考:[ビット演算 (bit 演算) の使い方を総特集! 〜 マスクビットから bit DP まで 〜](https://qiita.com/drken/items/7c6ff2aa4d8fce1c9361)
|
7
|
+
参考:[ビット演算 (bit 演算) の使い方を総特集! 〜 マスクビットから bit DP まで 〜](https://qiita.com/drken/items/7c6ff2aa4d8fce1c9361)
|
25
|
-
|
26
|
-
---
|
27
|
-
|
28
|
-
例==2かどうか
|
29
|
-
|
30
|
-
111 101 010 元データ
|
31
|
-
&演算
|
32
|
-
010 010 010 チェックbit
|
33
|
-
|
34
|
-
010 000 010 答え=bit系関数でカウント
|
35
|
-
|
36
|
-
AND演算後のONビットを数える関数で計算数回で出来そうです。
|
37
|
-
|
38
|
-
---
|
39
|
-
|
40
|
-
こんな感じで出来ます。27桁多いので9桁ですが。
|
41
|
-
```C++
|
42
|
-
#include <bitset>
|
43
|
-
#include <iostream>
|
44
|
-
|
45
|
-
using namespace std;
|
46
|
-
|
47
|
-
// >=2 )
|
48
|
-
void f3() {
|
49
|
-
string s1 = "100010001"; //ソース
|
50
|
-
bitset<9> b1(s1);
|
51
|
-
string s6 = "110110110"; //マスク6
|
52
|
-
bitset<9> b6(s6);
|
53
|
-
string s4 = "100100100"; //マスク4
|
54
|
-
bitset<9> b4(s4);
|
55
|
-
string s2 = "010010010"; //マスク2
|
56
|
-
bitset<9> b2(s2);
|
57
|
-
|
58
|
-
int sum = 0;
|
59
|
-
|
60
|
-
cout << "b1 " << b1 << endl;
|
61
|
-
cout << "b6 " << b6 << endl << endl;
|
62
|
-
b1 = b1 & b6;
|
63
|
-
|
64
|
-
bitset<9> b_tmp = b1;
|
65
|
-
|
66
|
-
cout << "AND&) " << b1 << endl;
|
67
|
-
cout << "b4 " << b4 << endl;
|
68
|
-
cout << "b1 " << b1 << endl;
|
69
|
-
b1 = b1 & b4;
|
70
|
-
sum += b1.count();
|
71
|
-
cout << "==4 ) " << b1.count() << endl << endl;
|
72
|
-
|
73
|
-
cout << "AND&) " << b_tmp << endl;
|
74
|
-
cout << "b2 " << b2 << endl;
|
75
|
-
b1 = b_tmp & b2;
|
76
|
-
cout << "b1 " << b1 << endl;
|
77
|
-
sum += b1.count();
|
78
|
-
cout << "2or3) " << b1.count() << endl << endl;
|
79
|
-
cout << ">=2 ) " << sum << endl;
|
80
|
-
}
|
81
|
-
|
82
|
-
// ==2 )
|
83
|
-
void f2() {
|
84
|
-
string s1 = "100010001"; //ソース
|
85
|
-
bitset<9> b1(s1);
|
86
|
-
string s2 = "010010010"; //マスク
|
87
|
-
bitset<9> b2(s2);
|
88
|
-
|
89
|
-
cout << "b1 " << b1 << endl;
|
90
|
-
cout << "b2 " << b2 << endl;
|
91
|
-
|
92
|
-
b1 = b1 & b2;
|
93
|
-
// b1 &= b2;
|
94
|
-
|
95
|
-
cout << "AND&) " << b1 << endl;
|
96
|
-
|
97
|
-
cout << "==2 ) " << b1.count() << endl << endl;
|
98
|
-
}
|
99
|
-
|
100
|
-
// >=1 )
|
101
|
-
void f1() {
|
102
|
-
string sc = "100010001"; //ソース
|
103
|
-
bitset<9> bs(sc);
|
104
|
-
string s4 = "100100100"; //マスク4
|
105
|
-
bitset<9> b4(s4);
|
106
|
-
string s2 = "010010010"; //マスク2
|
107
|
-
bitset<9> b2(s2);
|
108
|
-
string s1 = "001001001"; //マスク1
|
109
|
-
bitset<9> b1(s1);
|
110
|
-
|
111
|
-
int sum = 0;
|
112
|
-
bitset<9> tp;
|
113
|
-
tp = bs & b1;
|
114
|
-
sum += tp.count();
|
115
|
-
tp = bs & b2;
|
116
|
-
sum += tp.count();
|
117
|
-
tp = bs & b4;
|
118
|
-
sum += tp.count();
|
119
|
-
cout << ">=1 ) " << sum << endl << endl;
|
120
|
-
}
|
121
|
-
|
122
|
-
int main() {
|
123
|
-
f1();
|
124
|
-
f2();
|
125
|
-
f3();
|
126
|
-
getchar();
|
127
|
-
}
|
128
|
-
|
129
|
-
// 引用元
|
130
|
-
// https://c.keicode.com/cpp/bitwise-operations.php
|
131
|
-
```
|
132
|
-
|
133
|
-
```output
|
134
|
-
>=1 ) 3
|
135
|
-
|
136
|
-
b1 100010001
|
137
|
-
b2 010010010
|
138
|
-
AND&) 000010000
|
139
|
-
==2 ) 1
|
140
|
-
|
141
|
-
b1 100010001
|
142
|
-
b6 110110110
|
143
|
-
|
144
|
-
AND&) 100010000
|
145
|
-
b4 100100100
|
146
|
-
b1 100010000
|
147
|
-
==4 ) 1
|
148
|
-
|
149
|
-
AND&) 100010000
|
150
|
-
b2 010010010
|
151
|
-
b1 000010000
|
152
|
-
2or3) 1
|
153
|
-
|
154
|
-
>=2 ) 2
|
155
|
-
```
|
7
説明修正
answer
CHANGED
@@ -1,7 +1,19 @@
|
|
1
1
|
実装はもっとスマートに出来ると思いますが考え方だけ。
|
2
2
|
|
3
|
+
2以上の判定を行う例
|
4
|
+
27桁のソースに対して必要なマスクとの論理演算を行います。
|
5
|
+
`000000000000000100011010001`
|
6
|
+
`010010010010010010010010010`
|
7
|
+
|
8
|
+
分解イメージ
|
9
|
+
`000 000 000 000 000 100 011 010 001`
|
10
|
+
`010 010 010 010 010 010 010 010 010`
|
11
|
+
AND演算
|
12
|
+
`000 000 000 000 000 000 010 010 000`
|
13
|
+
結果のONビットのものをbitsetのcountでカウントする。
|
14
|
+
|
3
|
-
論理演算を数回組み合わせてマスクでふるいにかける感じで計算出来
|
15
|
+
その他条件でも論理演算を数回組み合わせてマスクでふるいにかける感じで計算出来そうです。
|
4
|
-
とりあえず>=1,==2,>=2は数えられ
|
16
|
+
とりあえず>=1,==2,>=2は数えられました。
|
5
17
|
合計は全要素操作するしかないと思われるので割愛します。
|
6
18
|
|
7
19
|
---
|
6
出力修正
answer
CHANGED
@@ -1,11 +1,31 @@
|
|
1
|
-
|
1
|
+
実装はもっとスマートに出来ると思いますが考え方だけ。
|
2
2
|
|
3
|
-
|
4
|
-
論理演算を数回組み合わせてマスクでふるいにかける感じで計算出来るかも知れません
|
3
|
+
論理演算を数回組み合わせてマスクでふるいにかける感じで計算出来るかも知れません。
|
5
4
|
とりあえず>=1,==2,>=2は数えられそうです。
|
6
5
|
合計は全要素操作するしかないと思われるので割愛します。
|
7
6
|
|
7
|
+
---
|
8
8
|
|
9
|
+
参考:[ビット演算](https://c.keicode.com/cpp/bitwise-operations.php)
|
10
|
+
|
11
|
+
|
12
|
+
参考:[ビット演算 (bit 演算) の使い方を総特集! 〜 マスクビットから bit DP まで 〜](https://qiita.com/drken/items/7c6ff2aa4d8fce1c9361)
|
13
|
+
|
14
|
+
---
|
15
|
+
|
16
|
+
例==2かどうか
|
17
|
+
|
18
|
+
111 101 010 元データ
|
19
|
+
&演算
|
20
|
+
010 010 010 チェックbit
|
21
|
+
|
22
|
+
010 000 010 答え=bit系関数でカウント
|
23
|
+
|
24
|
+
AND演算後のONビットを数える関数で計算数回で出来そうです。
|
25
|
+
|
26
|
+
---
|
27
|
+
|
28
|
+
こんな感じで出来ます。27桁多いので9桁ですが。
|
9
29
|
```C++
|
10
30
|
#include <bitset>
|
11
31
|
#include <iostream>
|
@@ -99,6 +119,8 @@
|
|
99
119
|
```
|
100
120
|
|
101
121
|
```output
|
122
|
+
>=1 ) 3
|
123
|
+
|
102
124
|
b1 100010001
|
103
125
|
b2 010010010
|
104
126
|
AND&) 000010000
|
@@ -118,24 +140,4 @@
|
|
118
140
|
2or3) 1
|
119
141
|
|
120
142
|
>=2 ) 2
|
121
|
-
|
122
|
-
```
|
143
|
+
```
|
123
|
-
|
124
|
-
参考:[ビット演算](https://c.keicode.com/cpp/bitwise-operations.php)
|
125
|
-
|
126
|
-
|
127
|
-
参考:[ビット演算 (bit 演算) の使い方を総特集! 〜 マスクビットから bit DP まで 〜](https://qiita.com/drken/items/7c6ff2aa4d8fce1c9361)
|
128
|
-
|
129
|
-
よく調べていませんが直感でいけそうかなと思ったので。
|
130
|
-
取り急ぎ思いつきですみません。
|
131
|
-
|
132
|
-
例==2かどうか
|
133
|
-
|
134
|
-
111 101 010 元データ
|
135
|
-
&演算
|
136
|
-
010 010 010 チェックbit
|
137
|
-
|
138
|
-
010 000 010 答え=bit系関数でカウント
|
139
|
-
|
140
|
-
AND演算後のONビットを数える関数で計算1回で出来そうですが
|
141
|
-
調べていないので関数を知りません。
|
5
>=1,>=2,==2 追記
answer
CHANGED
@@ -2,9 +2,10 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
論理演算を数回組み合わせてマスクでふるいにかける感じで計算出来るかも知れませんね。
|
5
|
-
とりあえず==2
|
5
|
+
とりあえず>=1,==2,>=2は数えられそうです。
|
6
|
-
|
6
|
+
合計は全要素操作するしかないと思われるので割愛します。
|
7
7
|
|
8
|
+
|
8
9
|
```C++
|
9
10
|
#include <bitset>
|
10
11
|
#include <iostream>
|
@@ -12,7 +13,7 @@
|
|
12
13
|
using namespace std;
|
13
14
|
|
14
15
|
// >=2 )
|
15
|
-
void
|
16
|
+
void f3() {
|
16
17
|
string s1 = "100010001"; //ソース
|
17
18
|
bitset<9> b1(s1);
|
18
19
|
string s6 = "110110110"; //マスク6
|
@@ -47,7 +48,7 @@
|
|
47
48
|
}
|
48
49
|
|
49
50
|
// ==2 )
|
50
|
-
void
|
51
|
+
void f2() {
|
51
52
|
string s1 = "100010001"; //ソース
|
52
53
|
bitset<9> b1(s1);
|
53
54
|
string s2 = "010010010"; //マスク
|
@@ -61,13 +62,35 @@
|
|
61
62
|
|
62
63
|
cout << "AND&) " << b1 << endl;
|
63
64
|
|
64
|
-
cout << "==2 ) " << b1.count() << endl;
|
65
|
+
cout << "==2 ) " << b1.count() << endl << endl;
|
65
66
|
}
|
66
67
|
|
68
|
+
// >=1 )
|
69
|
+
void f1() {
|
70
|
+
string sc = "100010001"; //ソース
|
71
|
+
bitset<9> bs(sc);
|
72
|
+
string s4 = "100100100"; //マスク4
|
73
|
+
bitset<9> b4(s4);
|
74
|
+
string s2 = "010010010"; //マスク2
|
75
|
+
bitset<9> b2(s2);
|
76
|
+
string s1 = "001001001"; //マスク1
|
77
|
+
bitset<9> b1(s1);
|
78
|
+
|
79
|
+
int sum = 0;
|
80
|
+
bitset<9> tp;
|
81
|
+
tp = bs & b1;
|
82
|
+
sum += tp.count();
|
83
|
+
tp = bs & b2;
|
84
|
+
sum += tp.count();
|
85
|
+
tp = bs & b4;
|
86
|
+
sum += tp.count();
|
87
|
+
cout << ">=1 ) " << sum << endl << endl;
|
88
|
+
}
|
89
|
+
|
67
90
|
int main() {
|
68
|
-
|
91
|
+
f1();
|
69
|
-
cout << endl;
|
70
92
|
f2();
|
93
|
+
f3();
|
71
94
|
getchar();
|
72
95
|
}
|
73
96
|
|
4
>=1の補足
answer
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
|
4
4
|
論理演算を数回組み合わせてマスクでふるいにかける感じで計算出来るかも知れませんね。
|
5
5
|
とりあえず==2と ==4と 2or3は数えられそうです。
|
6
|
+
>=1は書いてませんが同様に各ビット毎に1110 3回分count取れば数えられるはずです。
|
6
7
|
|
7
8
|
```C++
|
8
9
|
#include <bitset>
|
3
2以上の追記
answer
CHANGED
@@ -1,32 +1,102 @@
|
|
1
1
|
こんな感じで出来ます。27桁多いので9桁ですが。
|
2
|
+
|
3
|
+
|
4
|
+
論理演算を数回組み合わせてマスクでふるいにかける感じで計算出来るかも知れませんね。
|
5
|
+
とりあえず==2と ==4と 2or3は数えられそうです。
|
6
|
+
|
2
7
|
```C++
|
3
8
|
#include <bitset>
|
4
9
|
#include <iostream>
|
5
10
|
|
6
11
|
using namespace std;
|
7
12
|
|
13
|
+
// >=2 )
|
8
|
-
|
14
|
+
void f2() {
|
9
|
-
string s1 = "
|
15
|
+
string s1 = "100010001"; //ソース
|
10
16
|
bitset<9> b1(s1);
|
11
|
-
string
|
17
|
+
string s6 = "110110110"; //マスク6
|
18
|
+
bitset<9> b6(s6);
|
19
|
+
string s4 = "100100100"; //マスク4
|
20
|
+
bitset<9> b4(s4);
|
21
|
+
string s2 = "010010010"; //マスク2
|
12
22
|
bitset<9> b2(s2);
|
13
23
|
|
24
|
+
int sum = 0;
|
25
|
+
|
14
26
|
cout << "b1 " << b1 << endl;
|
27
|
+
cout << "b6 " << b6 << endl << endl;
|
28
|
+
b1 = b1 & b6;
|
29
|
+
|
30
|
+
bitset<9> b_tmp = b1;
|
31
|
+
|
32
|
+
cout << "AND&) " << b1 << endl;
|
33
|
+
cout << "b4 " << b4 << endl;
|
34
|
+
cout << "b1 " << b1 << endl;
|
35
|
+
b1 = b1 & b4;
|
36
|
+
sum += b1.count();
|
37
|
+
cout << "==4 ) " << b1.count() << endl << endl;
|
38
|
+
|
39
|
+
cout << "AND&) " << b_tmp << endl;
|
15
40
|
cout << "b2 " << b2 << endl;
|
41
|
+
b1 = b_tmp & b2;
|
42
|
+
cout << "b1 " << b1 << endl;
|
43
|
+
sum += b1.count();
|
44
|
+
cout << "2or3) " << b1.count() << endl << endl;
|
45
|
+
cout << ">=2 ) " << sum << endl;
|
46
|
+
}
|
16
47
|
|
48
|
+
// ==2 )
|
49
|
+
void f1() {
|
50
|
+
string s1 = "100010001"; //ソース
|
51
|
+
bitset<9> b1(s1);
|
52
|
+
string s2 = "010010010"; //マスク
|
53
|
+
bitset<9> b2(s2);
|
54
|
+
|
55
|
+
cout << "b1 " << b1 << endl;
|
56
|
+
cout << "b2 " << b2 << endl;
|
57
|
+
|
17
58
|
b1 = b1 & b2;
|
18
59
|
// b1 &= b2;
|
19
60
|
|
20
61
|
cout << "AND&) " << b1 << endl;
|
21
62
|
|
22
63
|
cout << "==2 ) " << b1.count() << endl;
|
64
|
+
}
|
23
65
|
|
66
|
+
int main() {
|
67
|
+
// f1();
|
68
|
+
cout << endl;
|
69
|
+
f2();
|
24
70
|
getchar();
|
25
71
|
}
|
26
72
|
|
73
|
+
// 引用元
|
27
74
|
// https://c.keicode.com/cpp/bitwise-operations.php
|
28
75
|
```
|
29
76
|
|
77
|
+
```output
|
78
|
+
b1 100010001
|
79
|
+
b2 010010010
|
80
|
+
AND&) 000010000
|
81
|
+
==2 ) 1
|
82
|
+
|
83
|
+
b1 100010001
|
84
|
+
b6 110110110
|
85
|
+
|
86
|
+
AND&) 100010000
|
87
|
+
b4 100100100
|
88
|
+
b1 100010000
|
89
|
+
==4 ) 1
|
90
|
+
|
91
|
+
AND&) 100010000
|
92
|
+
b2 010010010
|
93
|
+
b1 000010000
|
94
|
+
2or3) 1
|
95
|
+
|
96
|
+
>=2 ) 2
|
97
|
+
|
98
|
+
```
|
99
|
+
|
30
100
|
参考:[ビット演算](https://c.keicode.com/cpp/bitwise-operations.php)
|
31
101
|
|
32
102
|
|
2
コード追記
answer
CHANGED
@@ -1,3 +1,35 @@
|
|
1
|
+
こんな感じで出来ます。27桁多いので9桁ですが。
|
2
|
+
```C++
|
3
|
+
#include <bitset>
|
4
|
+
#include <iostream>
|
5
|
+
|
6
|
+
using namespace std;
|
7
|
+
|
8
|
+
int main() {
|
9
|
+
string s1 = "010010010";
|
10
|
+
bitset<9> b1(s1);
|
11
|
+
string s2 = "111101010";
|
12
|
+
bitset<9> b2(s2);
|
13
|
+
|
14
|
+
cout << "b1 " << b1 << endl;
|
15
|
+
cout << "b2 " << b2 << endl;
|
16
|
+
|
17
|
+
b1 = b1 & b2;
|
18
|
+
// b1 &= b2;
|
19
|
+
|
20
|
+
cout << "AND&) " << b1 << endl;
|
21
|
+
|
22
|
+
cout << "==2 ) " << b1.count() << endl;
|
23
|
+
|
24
|
+
getchar();
|
25
|
+
}
|
26
|
+
|
27
|
+
// https://c.keicode.com/cpp/bitwise-operations.php
|
28
|
+
```
|
29
|
+
|
30
|
+
参考:[ビット演算](https://c.keicode.com/cpp/bitwise-operations.php)
|
31
|
+
|
32
|
+
|
1
33
|
参考:[ビット演算 (bit 演算) の使い方を総特集! 〜 マスクビットから bit DP まで 〜](https://qiita.com/drken/items/7c6ff2aa4d8fce1c9361)
|
2
34
|
|
3
35
|
よく調べていませんが直感でいけそうかなと思ったので。
|
1
リンク追加
answer
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
参考:[ビット演算 (bit 演算) の使い方を総特集! 〜 マスクビットから bit DP まで 〜](https://qiita.com/drken/items/7c6ff2aa4d8fce1c9361)
|
2
|
+
|
1
3
|
よく調べていませんが直感でいけそうかなと思ったので。
|
2
4
|
取り急ぎ思いつきですみません。
|
3
5
|
|