AIZU ONLINE JUDGE

AOJ ITP2 10_A(Bit Operation I)を解く

AOJ_ITP2_10_A

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引数で与えた位置のビットを反転する。
count1になっているビットの数を取得する。
test引数で与えた位置のビットが1になっているかを判定する。
all全てのビットが1になっているかを判定する。C++11以降の機能
anyいずれかのビットが1になっているかを判定する。
none全てのビットが0になっているかを判定する。
to_ulongunsigned long型に変換する。
to_ullongunsigned 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 の問題を紹介していきます。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA