2024/06/03 電子書籍「電子書籍出版・技術文書作成を劇的に加速!秀丸エディタ + Markdown + Pandocの驚異」を出版

2進数表記

C++Builder

C++14では、新しい整数リテラルとして2進数リテラルが追加されました。

C++Builder 12でも、使用可能なようです。ただし、32ビットでは、Clangベースのコンパイラ(BCC32C)を使用する必要があります。

0b0Bプレフィックスによる2進数リテラルは、GCCやClangの言語拡張として古くからサポートされていたほか、Java、Python、Dといった言語でも同じ構文でサポートされていました。こういった経緯から、C++標準で2進数リテラルをサポートすることとなったようです。

Clangベースのコンパイラ(BCC32C)の選択

32ビットでは、Clangベースのコンパイラ(BCC32C)を使用する必要があります。RAD STUDIO 12 では、デフォルトでBCC32Cの設定になっているちょうです。

メインメニューから「プロジェクト」→「オプション」を選択して「オプションの設定」ダイアログを表示します。その設定ダイアログの、「ビルド」→「C++コンパイラ」で、「C++コンパイラ(WIN32)」をfalseにすると、コンパイラーとして「BCC32C」が使用されます。

2進数リテラル

整数リテラルのプレフィックスとして0bもしくは0Bを付けることで、2進数を表す値を記述できます。

それから、桁区切り文字 ”” が使用できます。

サンプルコード

//  int x = 0b1010;
  int x = 0B1010;
  Memo1->Lines->Add(IntToStr(x));

  // 数値リテラルの桁区切り文字と組み合わせて、4桁区切りする
  int y = 0b1000'1111;
  Memo1->Lines->Add(IntToStr(y));
  • 実行委結果
10
143

仕様

以下、2進数リテラルの仕様です。

  • 浮動小数点数を含まない、整数リテラルに対してのみ、2進数リテラルを使用できる
  • 2進数リテラルを記述するには、 0b もしくは 0B プレフィックスを指定する
  • 数値部分に入力できる数字・文字は 0 と 1 のみである
  • 2進数リテラルは、リテラル演算子と組み合わせて使用できる

各進数の表記

進数表記
10進数リテラルプレフィックスの指定なし
16進数リテラル0x もしくは 0X をプレフィックスとして指定する
8進数リテラル0 をプレフィックスとして指定する
2進数リテラル0b もしくは 0B をプレフィックスとして指定する

2進数の文字列の表示

2進数の文字列の表示は、std::bitsetクラスを使用して可能です。

std::bitsetは、Nビットのビット集合を表すクラスである。添字演算子で任意の位置のビット状態を確認でき、文字列と整数値との相互変換が可能です。

<bitset>ヘッダでは、ビットの固定サイズ配列を計算するためのstd::bitsetクラスを定義しています。

メンバ関数

構築・破棄

名前説明
(constructor)コンストラクタ
~bitset() = defaultデストラクタ
bitset& operator=(const bitset&) = default代入演算子

集合演算

名前説明
operator&=論理積の複合演算
operator|=論理和の複合演算
operator^=排他的論理和の複合演算
operator<<=左シフトの複合演算
operator>>=右シフトの複合演算
set任意の位置のビットを設定する
reset任意の位置のビットを0にする
operator~ビットを反転させる
flipビットを反転させる

要素アクセス

名前説明
operator[]任意の位置のビットにアクセスする
count1になっているビットの数を取得する
sizeビット数を取得する
test任意の位置のビットが1になっているかを判定する
all全てのビットが1になっているかを判定する
anyいずれかのビットが1になっているかを判定する
none全てのビットが0になっているかを判定する
to_ulongunsigned long型に変換する
to_ullongunsigned long long型に変換する
to_string文字列に変換する
operator==等値比較
operator!=非等値比較
operator<<左シフト
operator>>右シフト
要素アクセス

サンプルコード1

// インクルードファイル
#include <iostream>
#include <bitset>

// サンプルコード
	std::bitset<8> bits(0b1101);  // 初期化時に2進数リテラルを使用
//	std::bitset<32> bits(0x12345678);  // 初期化時に2進数リテラルを使用
	// ビットセットを文字列に変換
	std::string bitString = bits.to_string();
	Memo1->Lines->Add(( String)(bitString.c_str()) );
  • 実行結果
// std::bitset<8> bits(0b1101);
00001101

//	std::bitset<32> bits(0x12345678); 
00010010001101000101011001111000

サンプルコード2

std::bitsetクラスを使用した、2進数の文字列を表示する関数のサンプルです。

String IntToBinaryString(int value, int bits = 32) 
{
	std::bitset<32> bitset(value);
	std::string bitString = bitset.to_string();
	return String(bitString.c_str()).SubString(32 - bits + 1, bits);
}

void __fastcall TSDIAppForm::test(void)
{
	String wstr	= IntToBinaryString(1111);
	Memo1->Lines->Add(wstr);
}
  • 実行結果

00000000000000000000010001010111

参考URL

  • 2進数リテラル [N3472]
2進数リテラル [N3472] - cpprefjp C++日本語リファレンス
整数リテラルのプレフィックスとして`0b`もしくは`0B`を付けることで、2進数を表す値を記述できる。
bitset - cpprefjp C++日本語リファレンス
``ヘッダでは、ビットの固定サイズ配列を計算するための`std::bitset`クラスを定義する。
タイトルとURLをコピーしました