静的アサーションと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 が式になってるのがポイント。