yappy #4604(2007/12/04 18:08 GMT) [ C ] Rating3/3=1.00
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
/* 使用例 0を詰めても桁数が半端でも大丈夫 bintest.c */ #include <stdio.h> #include "binary.h" int main(){ printf("%u\n", bin(0111)); printf("%u\n", bin(11111)); printf("%u\n", bin(11111111111111111111111111111111)); } /* 2進数記述マクロ binary.h */ #ifndef BINARY_H_INCLUDE #define BINARY_H_INCLUDE #define bin(n) ((sizeof(#n)<33?0:(#n[sizeof(#n)-33]-'0') << 31) |\ (sizeof(#n)<32?0:(#n[sizeof(#n)-32]-'0') << 30) |\ (sizeof(#n)<31?0:(#n[sizeof(#n)-31]-'0') << 29) |\ (sizeof(#n)<30?0:(#n[sizeof(#n)-30]-'0') << 28) |\ (sizeof(#n)<29?0:(#n[sizeof(#n)-29]-'0') << 27) |\ (sizeof(#n)<28?0:(#n[sizeof(#n)-28]-'0') << 26) |\ (sizeof(#n)<27?0:(#n[sizeof(#n)-27]-'0') << 25) |\ (sizeof(#n)<26?0:(#n[sizeof(#n)-26]-'0') << 24) |\ (sizeof(#n)<25?0:(#n[sizeof(#n)-25]-'0') << 23) |\ (sizeof(#n)<24?0:(#n[sizeof(#n)-24]-'0') << 22) |\ (sizeof(#n)<23?0:(#n[sizeof(#n)-23]-'0') << 21) |\ (sizeof(#n)<22?0:(#n[sizeof(#n)-22]-'0') << 20) |\ (sizeof(#n)<21?0:(#n[sizeof(#n)-21]-'0') << 19) |\ (sizeof(#n)<20?0:(#n[sizeof(#n)-20]-'0') << 18) |\ (sizeof(#n)<19?0:(#n[sizeof(#n)-19]-'0') << 17) |\ (sizeof(#n)<18?0:(#n[sizeof(#n)-18]-'0') << 16) |\ (sizeof(#n)<17?0:(#n[sizeof(#n)-17]-'0') << 15) |\ (sizeof(#n)<16?0:(#n[sizeof(#n)-16]-'0') << 14) |\ (sizeof(#n)<15?0:(#n[sizeof(#n)-15]-'0') << 13) |\ (sizeof(#n)<14?0:(#n[sizeof(#n)-14]-'0') << 12) |\ (sizeof(#n)<13?0:(#n[sizeof(#n)-13]-'0') << 11) |\ (sizeof(#n)<12?0:(#n[sizeof(#n)-12]-'0') << 10) |\ (sizeof(#n)<11?0:(#n[sizeof(#n)-11]-'0') << 9) |\ (sizeof(#n)<10?0:(#n[sizeof(#n)-10]-'0') << 8) |\ (sizeof(#n)<9?0:(#n[sizeof(#n)-9]-'0') << 7) |\ (sizeof(#n)<8?0:(#n[sizeof(#n)-8]-'0') << 6) |\ (sizeof(#n)<7?0:(#n[sizeof(#n)-7]-'0') << 5) |\ (sizeof(#n)<6?0:(#n[sizeof(#n)-6]-'0') << 4) |\ (sizeof(#n)<5?0:(#n[sizeof(#n)-5]-'0') << 3) |\ (sizeof(#n)<4?0:(#n[sizeof(#n)-4]-'0') << 2) |\ (sizeof(#n)<3?0:(#n[sizeof(#n)-3]-'0') << 1) |\ (sizeof(#n)<2?0:(#n[sizeof(#n)-2]-'0') << 0)) #endif /* binary.h生成プログラム binary.c */ #include <stdio.h> #define BIT 32 int main(){ int i; freopen("binary.h", "w", stdout); puts("#ifndef BINARY_H_INCLUDE"); puts("#define BINARY_H_INCLUDE"); puts(""); printf("#define bin(n) ("); for(i=0; i<BIT; i++){ printf("(sizeof(#n)<%d?0:(#n[sizeof(#n)-%d]-'0') << %d)", BIT-i+1, BIT-i+1, BIT-i-1); if(i != BIT-1) printf(" |\\\n"); } printf(")\n"); puts(""); puts("#endif"); }
Rating3/3=1.00-0+
[ reply ]
yappy
#4604()
[
C
]
Rating3/3=1.00
Cのマクロによる実装です。
引数に二進数表現を受け取り、#によってダブルクォーテーションでくくって文字列にします。
ここで、文字列リテラルのサイズ(NULL文字含む)がsizeof("str")で取得できる(この場合4)を利用して、左の方が足りないときは0と見なします。そうでないなら文字コードの'0'と'1'で判定します。
#4585を任意文字数にした感じでしょうか。
Rating3/3=1.00-0+
[ reply ]