C言語:2進数表記マクロ

C言語はアセンブラに近いにもかかわらず、なぜか2進表記ができません。ハードウェアに近いところを触っているときは、特に思います。

unsigned char a = 01000101B;

のような記述がなぜできないのか!と思ったのは私だけではないでしょう。独自の拡張をしているコンパイラもあるようです。

しかし、いまや、2進数表記マクロを作ることができます。

コンパイラの条件は、
・long型が32ビットであること。
・プリプロセッサに文字列連結演算子 ## があること。

#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))

main()
{
    unsigned char      a=B8(10101010);
    unsigned short int b=B16(10101010, 01010101);
    unsigned long      c=B32(10101010, 01010101,
                                       11111111, 00000000);

    printf( "%02lxn", a ); /* AA と表示するはず */
    printf( "%04lxn", b ); /* AA55 と表示するはず */
    printf( "%08lxn", c ); /* AA55FF00 と表示するはず */
}

(2000年頃の記事)

“C言語:2進数表記マクロ” への1件の返信

  1. 2進数化は自分も困っていたところです。
    ドットマトリクス制御で、LEDの点灯パターンをデータ化したかったので、大変参考になりました。
    ありがとうございました。

コメントは受け付けていません。