Aizu Online Judge(AOJ)が提供している「プログラミング応用」(ITP2)の10_A問題をC++で解いてみました。
ITP2では、「プログラミングのための基礎ライブラリを獲得します」とあります。トピック#10では、ビットセットI(bitset)を学びます。
問題(10_A: Bit Operation I)
問題はリンク先をご覧ください。
AOJ ITP2 10_A問題: Bit Operation I
bitset クラスについて学びます。
bitset クラスについて
以下は、cpprefjp 様の記事を参考にさせていただきました。
概略
bitset クラスは、ビットの固定サイズ配列を計算するためのクラスです。
テンプレートパラメータで、ビット数を指定します。
主な演算子、メソッド
クラスで使うことができる主な演算子を紹介します。
演算子 | 説明 |
operator~ | ビットを反転させる |
operator& | 論理積 |
operator| | 論理和 |
operator^ | 排他的論理和 |
operator<< | 左シフト |
operator>> | 右シフト |
よく使われるメソッドを紹介します。
名前 | 説明 |
set | 引数で与えた位置のビットを1にセットする。 |
reset | 引数で与えた位置のビットを0にリセットする。 |
flip | 引数で与えた位置のビットを反転する。 |
count | 1になっているビットの数を取得する。 |
test | 引数で与えた位置のビットが1になっているかを判定する。 |
all | 全てのビットが1になっているかを判定する。C++11以降の機能 |
any | いずれかのビットが1になっているかを判定する。 |
none | 全てのビットが0になっているかを判定する。 |
to_ulong | unsigned long 型に変換する。 |
to_ullong | unsigned long long 型に変換する。C++11以降の機能 |
to_string | 文字列に変換する |
コンストラクタとしては、以下があります(デフォルトコンストラクタを除く)。
unsigned long型
またはunsigned long long
型の整数値を指定する。
※unsigned long long
型は、C++11以降- ‘0’と’1’の文字で構成される basic_string を指定する。
- ‘0’と’1’の文字で構成される文字配列 を指定する。
C++ プログラム例(ITP2 10_A)
32ビット整数が与えられます。その整数を2進数に変換して、以下の操作を行い、その結果をビット列として出力します。
- 反転:すべてのビットを反転する。
- 左シフト:左に1ビットシフトする。
- 右シフト:右に1ビットシフトする。
整数を引数に bitset クラスのコンストラクタを呼び出し(11行目)、演算を行った結果を出力します(13ー16行目)。
#include <iostream>
#include <bitset>
using namespace std;
int main()
{
unsigned long int ul;
cin >> ul;
bitset<32> bs(ul);
cout << bs << endl;
cout << ~bs << endl;
cout << (bs << 1ULL) << endl;
cout << (bs >> 1ULL) << endl;
return 0;
}
上記プログラムは、AOJ で「AC(Accepted=正解)」と判定されました。
最後に
bitset クラスは、2進数を扱うときには便利なクラスだと考えています。トピック#10 を通じて、このクラスを学びます。
引き続き、ITP2 の問題を紹介していきます。