C++14では、新しい整数リテラルとして2進数リテラルが追加されました。
C++Builder 12でも、使用可能なようです。ただし、32ビットでは、Clangベースのコンパイラ(BCC32C)を使用する必要があります。
0b
/0B
プレフィックスによる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[] | 任意の位置のビットにアクセスする |
count | 1になっているビットの数を取得する |
size | ビット数を取得する |
test | 任意の位置のビットが1になっているかを判定する |
all | 全てのビットが1になっているかを判定する |
any | いずれかのビットが1になっているかを判定する |
none | 全てのビットが0になっているかを判定する |
to_ulong | unsigned long型に変換する |
to_ullong | unsigned 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]