No.17693![]() |
10進数→2進数変換 投稿者---7(2004/11/01 19:53:50) |
||
2進数変換のプログラムなのですが、もっと簡単に変換、表示する 方法はあるでしょうか?ビット演算子とシフト演算子を使って作成 したいのです。 int i = 0; unsigned long b = 0x80000000; /* 2進数表示 */ do{ /* 真ならば1を表示、偽ならば0を表示 */ if(a & b){ printf("1"); } else{ printf("0"); } i++; //インクリメント /* 4ビットごとにスペースを入れる */ if((i%4) == 0){ printf(" "); } b = b >> 1; //ビットシフト }while(b != 0x00000000); |
No.17699![]() |
Re:10進数→2進数変換 投稿者---かずま(2004/11/01 21:14:41) |
||
> 2進数変換のプログラムなのですが、もっと簡単に変換、表示する > 方法はあるでしょうか? > ビット演算子とシフト演算子を使って作成したいのです。 a & b や b >> 1 でビット演算子とシフト演算子を使っていますね。 これで十分簡単だと思いますよ。 ただ、printf("1") より putchar('1') の方が軽いでしょう。 また、if((i%4) == 0) { printf(" "); } は、 if (++i == 4) { i = 0; putchar(' '); } の方がいいと思います。 それとも、こんな変なプログラムをお望みですか? #define S " \0\0\0 \0\0\0" void put_binary(unsigned long a) { int i = 32; while (i--) printf("%d%s", a >> i & 1, S S S S + i); } |
No.17700![]() |
Re:10進数→2進数変換 投稿者---かずま(2004/11/01 21:59:06) |
||
> int i = 32; > while (i--) printf("%d%s", a >> i & 1, S S S S + i); printf は重いので、putchar にします。 int i = 32, s = 0x11111111; while (i--) putchar((a>>i & 1) + '0'), s>>i && putchar(' '); |
No.17709![]() |
Re:10進数→2進数変換 投稿者---NykR(2004/11/02 02:39:35) |
||
while (i--) putchar((a>>i & 1) + '0'), s>>i && putchar(' '); スペースの出力の際の判定部分、& 1 か何かが抜けています。 |
No.17713![]() |
Re:10進数→2進数変換 投稿者---かずま(2004/11/02 09:42:03) |
||
> スペースの出力の際の判定部分、& 1 か何かが抜けています。 そうですね。やっぱり、ちゃんと実行したものを投稿しないといけませんね。 ご指摘ありがとうございます。 int が 16ビットの処理系だと s は long にしたほうがよいでしょうし、 最後のスペースは不要ですから、0x11111110 にします。 #include <stdio.h> void put_binary(unsigned long a) { int i = 32; long s = 0x11111110; while (i--) { putchar(a>>i & 1 | '0'); if (s>>i & 1) putchar(' '); } } int main(void) { unsigned long x; while (scanf("%li", &x) == 1) { put_binary(x); putchar('\n'); } return 0; } |