Aizu Online Judge(AOJ)が提供している「プログラミング応用」(ITP2)の10_C問題をC++で解いてみました。
ITP2では、「プログラミングのための基礎ライブラリを獲得します」とあります。トピック#10では、ビットセットI(bitset)を学びます。
問題(10_C: Bit Flag)
問題はリンク先をご覧ください。
bitset クラスについて学びます。
bitset クラスについて
以下は、cpprefjp 様の記事を参考にさせていただきました。
今回使う bitset クラスの演算子は、10_A で紹介しています。
C++ プログラム例(ITP2 10_C)
64個のフラグを64ビット2進数と考えて、以下の操作を行います。初期値は0とします。
- test(i):i番目のフラグの状態がONの場合1、OFFの場合0を出力する。
- set(i):i番目のフラグをONにする。
- clear(i):i番目のフラグをOFFにする。
- flip(i):i番目のフラグを反転する。
- all:全てのフラグがONになっている場合1、なっていない場合0を出力する。
- any:いずれかのフラグがONになっている場合1、なっていない場合0を出力する。
- none:全てのフラグがOFFになっている場合1、なっていない場合0を出力する。
- count:ONになっているフラグの数を出力する。
- val:状態の整数値を出力する(64ビット整数に変換して出力する)。
64ビット整数0を引数に bitset クラスのコンストラクタを呼び出し(8行目)、クエリに従い、bitset クラスのメソッドを呼び出します。bitset クラスに関係するコードの背景色を変更しました。
#include <iostream>
#include <bitset>
using namespace std;
int main()
{
bitset<64> x(0ULL);
int q;
cin >> q;
for (int j = 0; j < q; ++j) {
int command;
cin >> command;
int i;
switch (command){
case 0:
cin >> i;
if (x.test(i)) {
cout << 1 << endl;
} else {
cout << 0 << endl;
}
break;
case 1:
cin >> i;
x.set(i);
break;
case 2:
cin >> i;
x.reset(i);
break;
case 3:
cin >> i;
x.flip(i);
break;
case 4:
if (x.all()) {
cout << 1 << endl;
} else {
cout << 0 << endl;
}
break;
case 5:
if (x.any()) {
cout << 1 << endl;
} else {
cout << 0 << endl;
}
break;
case 6:
if (x.none()) {
cout << 1 << endl;
} else {
cout << 0 << endl;
}
break;
case 7:
cout << x.count() << endl;
break;
case 8:
cout << x.to_ullong() << endl;
break;
default:
break;
}
}
return 0;
}
上記プログラムは、AOJ で「AC(Accepted=正解)」と判定されました。
最後に
今回は、bitset クラスで使えるメソッドを試しました。問題自体が bitset クラスのメソッドを試すように作られていました。
引き続き、ITP2 の問題を紹介していきます。