こういうビットマップ(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進数リテラルを再発明しようという人は↑も参考にしたらいいと思う。
ISO 8988:1999 の規格では
一つの下線で始まるすべての識別子は,通常の名前空間及びタグ名前空間の双方におけるファイル有効範囲をもつ識別子としての使用に対して,常に予約済みとする。
とあるのでマクロ名に _ とするとは 規格 NG になります