C言語関係掲示板

過去ログ

No.1315 10進数→2進数変換

[戻る] [ホームページ]
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;
}