#define BIN(x) ( \
(((x) / 1 & 1) << 0) + \
(((x) / 10 & 1) << 1) + \
(((x) / 100 & 1) << 2) + \
(((x) / 1000 & 1) << 3) + \
(((x) / 10000 & 1) << 4) + \
(((x) / 100000 & 1) << 5) + \
(((x) / 1000000 & 1) << 6) + \
(((x) / 10000000 & 1) << 7))
こんなのだめ?
>>175 すまない。意図かあるいは使用例あたりを示してはくれまいか。
なるほどこういうことか
printf("%d\n", BIN(1111)); // 15
printf("%d\n", BIN(1110)); // 14
printf("%d\n", BIN(1101)); // 13
printf("%d\n", BIN(1100)); // 12
printf("%d\n", BIN(1011)); // 11
printf("%d\n", BIN(1010)); // 10
printf("%d\n", BIN(1001)); // 9
printf("%d\n", BIN(1000)); // 8
だがこの調子で行くと7以下は微妙だな…
printf("%d\n", BIN(0111)); // 3
printf("%d\n", BIN(0110)); // 2
printf("%d\n", BIN(0101)); // 1
printf("%d\n", BIN(0100)); // 0
printf("%d\n", BIN(0011)); // 1
printf("%d\n", BIN(0010)); // 0
printf("%d\n", BIN(0001)); // 1
printf("%d\n", BIN(0000)); // 0
Prefix 0 はCの仕様として8進定数になってしまうから
桁を揃えようとすると上手くいかなくなる…
もちろんBIN( 111)とやればうまく7になるんだが、
二進で定数書きたいときは普通桁そろえたいよな…
こんなの見た事が。
enum {
b0, b1
};
enum {
b00, b01, b10, b11
};
以下似たような奴の羅列。
強引に8進定数にすればいいじゃないか
#define BIN(x) BIN_I(0 ## x ## u) /* uは気休め */
#define BIN_I(x) ( \
(x >> 0 & 1) << 0 | \
(x >> 3 & 1) << 1 | \
(x >> 6 & 1) << 2 | \
(x >> 9 & 1) << 3)
int i[BIN(1111)]; /* 15 */
int j[BIN(0010)]; /* 2 */