C言語でなんちゃって2進数リテラル

こういうビットマップ(1ピクセルにつき1ビット)を、整数の配列としてC言語のソースコード中に埋め込みたい:

□□□□□
■■■■■
□■□■□
□■□■□
■□□■■
□□□□□

2進数リテラルがあればそれを使うという手があるが、残念ながらC言語には2進数リテラルがない(ちなみに、C++にはC++14から2進数リテラルが入った。また、独自拡張で2進数リテラルが使えるコンパイラーもある)。

というわけで、自分で作ることにした。要件としては

  • コンパイル時定数となる
  • 桁を空白で区切れる

がある。

挙動としては 0b01101 を表したかったら VAL(_ X X _ X) と書けば (((0 << 7) + (1 << 6) + (1 << 5) + (0 << 4) + (1 << 3) + 0) >> 3) という式に展開される。

1の桁を表すために X、 0の桁を表すために _ というマクロを定義していて行儀が悪いが、広く使われるわけでもないし、問題になれば #undef すればいいので、まあ良しとする。

ビットシフトは + 演算よりも優先順位が低いので、本来は >> の左側のカッコは必要ないが、カッコをつけないとお節介なコンパイラーさんが警告を出してくるのでカッコをつけることにした。

ここまで書いてからググったら

という良さげな記事がヒットしたので、これから2進数リテラルを再発明しようという人は↑も参考にしたらいいと思う。


コメントを残す

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