2進数表記マクロ
C言語:2進数表記マクロ
http://b.hatena.ne.jp/entry/2009320
キャッシュしか無いので、コピペしとく
C言語:2進数表記マクロ
C言語はアセンブラに近いにもかかわらず、なぜか2進表記ができません。ハードウェアに近いところを触っているときは、特に思います。
unsigned char a = 01000101B;
のような記述がなぜできないのか!と思ったのは私だけではないでしょう。独自の拡張をしているコンパイラもあるようです。
しかし、いまや、2進数表記マクロを作ることができます。
コンパイラの条件は、
・long型が32ビットであること。
・プリプロセッサに文字列連結演算子 ## があること。
#define B8(y) ( *1 #define B32(hh, hl, lh, ll) (B16(hh, hl)<<16 | B16(lh, ll)) main() { unsigned char a=B8(10101010); unsigned short int b=B16(10101010, 01010101); unsigned long c=B32(10101010, 01010101, 11111111, 00000000); printf( "%02lx\n", a ); /* AA と表示するはず */ printf( "%04lx\n", b ); /* AA55 と表示するはず */ printf( "%08lx\n", c ); /* AA55FF00 と表示するはず */ }
*1: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