読者です 読者をやめる 読者になる 読者になる

とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

二進数表記できるマクロ

じゃあ,プリプロセッサの力を借りてC言語C++でも二進数を書けるようにしようぜ!

// ライブラリ
// SSCRISK_BINARY(binary)
// 0 〜 11111111111 (2047) まで対応している二進数表記用のマクロ
#define SSCRISK_BINARY_I(b) ( \
 ((b & 1 <<  0) >>  0) + ((b & 1 <<  3) >>  2) + ((b & 1 <<  6) >>  4) + \
 ((b & 1 <<  9) >>  6) + ((b & 1 << 12) >>  8) + ((b & 1 << 15) >> 10) + \
 ((b & 1 << 18) >> 12) + ((b & 1 << 21) >> 14) + ((b & 1 << 24) >> 16) + \
 ((b & 1 << 27) >> 18) + ((b & 1 << 30) >> 20))
#define SSCRISK_BINARY(binary) SSCRISK_BINARY_I(0 ## binary)


// クライアント
#include<iostream>
#define B SSCRISK_BINARY
int main()
{
 using namespace std;
 cout << B(0) << endl // 最小値
  << B(1) << endl
  << B(10) << endl
  << B(11) << endl
  << B(100) << endl
  << B(101) << endl
  << B(110) << endl
  << B(111) << endl
  << B(1000) << endl
  << B(10000) << endl
  << B(100000) << endl
  << B(1000000) << endl
  << B(10000000) << endl
  << B(100000000) << endl
  << B(1000000000) << endl
  << B(10000000000) << endl
  << B(11111111111) << endl // 最大値。11桁
  // << B(100000000000) << endl // エラー。未定義動作。
 ;
}
#undef B

実行結果:

0
1
2
3
4
5
6
7
8
16
32
64
128
256
512
1024
2047

Ideone.com | YeCES

追記

BOOST_BINARY

Boost に BOOST_BINARY というマクロが用意されているようです。

Header boost/utility.hpp Documentation

GCC拡張

kikairoyaさんにコメントをいただきました。0bプレフィックスで二進数リテラルを書けるそうです。

最近のGCC拡張なら普通に0b01が使えますね

組込みの各種処理系

たかぎさんにコメントをいただきました。0bプレフィックス,あるいは0yプレフィックスで二進数リテラルを書けるそうです。

組込み用の処理系では、0bを付ければ2進数になるものはときどき見かけます。
他に、東芝の処理系だったかでは、0yを付ければ2進数になったような記憶があります。

それにしてもどうして y なんでしょうね? binar"y" の y なのでしょうか?