C言語はアセンブラに近いにもかかわらず、2進表記ができません。ハードウェアに近いところを触っているときは、特に思います。
/* こんな記述をしたい! */
unsigned char a = 01000101B;
Code language: JavaScript (javascript)
独自の拡張をしているコンパイラもあるようです。
しかし、いまや、2進数表記マクロを作ることができます。
コンパイラの条件は、
- long型が32ビットであること。
- プリプロセッサに文字列連結演算子 ## があること。
/* b8sample.c */
#include <stdio.h>
#define B8(y) ( ((0x##y##L & 0x00000001L) >> 0) \
| ((0x##y##L & 0x00000010L) >> 3) \
| ((0x##y##L & 0x00000100L) >> 6) \
| ((0x##y##L & 0x00001000L) >> 9) \
| ((0x##y##L & 0x00010000L) >> 12) \
| ((0x##y##L & 0x00100000L) >> 15) \
| ((0x##y##L & 0x01000000L) >> 18) \
| ((0x##y##L & 0x10000000L) >> 21) )
#define B16(h,l) (B8(h)<<8 | B8(l))
#define B32(hh, hl, lh, ll) (B16(hh, hl)<<16 | B16(lh, ll))
void main()
{
unsigned char a=B8(10101010);
unsigned short int b=B16(10101010, 01010101);
unsigned long c=B32(10101010, 01010101, 11111111, 00000000);
printf( "%02x\n", a ); /* aa と表示するはず */
printf( "%04x\n", b ); /* aa55 と表示するはず */
printf( "%08lx\n", c ); /* aa55ff00 と表示するはず */
}
Code language: C++ (cpp)
(2000年頃の記事)
Ubuntu 18.04 のgcc 7.5.0 で動くように修正しました。
$ gcc b8sample.c
$ ./a.out
aa
aa55
aa55ff00
Code language: Bash (bash)
コメント
2進数化は自分も困っていたところです。
ドットマトリクス制御で、LEDの点灯パターンをデータ化したかったので、大変参考になりました。
ありがとうございました。