静的アサーションと2進リテラル

某所にも書き込んだものだが、
静的アサーションと2進リテラルをここにも書いとく。
質問は一切受け付けないので、
何がどうなってるか各自で考えて欲しい。

#include <stdio.h>

/* 静的アサーション
 * 静的定数 b が偽だとコンパイルエラーにする。
 * b が動的な値の場合もコンパイルエラー。 */
#define SASSERT(b) ((void)(int(*)[(b) ? 1 : -1])0)

/* 2進1バイトリテラル
 * CHAR_BIT に関わらず、8 ビット(16進2桁)まで。 */
#define BYTE2(x) \
  (SASSERT(1 <= sizeof(#x)-1 && sizeof(#x)-1 <= 8), \
   SASSERT((0x##x & ~0x11111111) == 0), \
   (0x##x >>  0) & 0x01 | \
   (0x##x >>  3) & 0x02 | \
   (0x##x >>  6) & 0x04 | \
   (0x##x >>  9) & 0x08 | \
   (0x##x >> 12) & 0x10 | \
   (0x##x >> 15) & 0x20 | \
   (0x##x >> 18) & 0x40 | \
   (0x##x >> 21) & 0x80)

/* 2進2バイトリテラル */
#define WORD2(x1, x0) \
  ((BYTE2(x1) << 8) | BYTE2(x0))

/* 2進4バイトリテラル */
#define DWORD2(x3, x2, x1, x0) \
  ((WORD2(x3, x2) << 16) | WORD2(x1, x0))

int main() {
  printf("%X\n", BYTE2(01011011));
  printf("%X\n", WORD2(11001011, 10000011));
  printf("%X\n", DWORD2(01011011, 11001011,
                        10000011, 00000000));
  return 0;
}

SASSERT が式になってるのがポイント。