C言語ケーススタディ 数値を2進数表記で表示




2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を強力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。



printf関数の書式設定では数値を10進数、8進数、16進数で表示するように指定することができます。
        printf("%d", 10);       10進数で表示
        printf("%o", 8);         8進数で表示
        printf("%x", 16);       16進数で表示
ただし、これ以外のN進数で表示する機能はありません。 だからといって、5進数で表示といったニーズはほとんど無いと思います。 しかし、2進数で表示したいことは時々あるので、今回は2進数表示プログラムを作成します。
次のプログラムは変数binに格納された値を2進数表記でbuff配列に格納して表示するものです。 Windows9xのコンパイラはint型が32ビットなので結果は32桁の文字列になります。
主な処理としては次のようになります。
(1)32桁分のループで文字を作成していきます。
(2)ループごとに2で割っていきます。
(3)ループごとに2で割ったあまりがその桁の値になります。
(4)2進数の下の桁から評価するのでbuff配列へは反対から(配列の最後から)埋めていきます。
main()
{
        char    buff[32+1];
        int     bin;
        int     i1;

        bin = 128;
        buff[32] = '\0';
        for(i1 = 0; i1 < 32; i1++){
                if(i1 != 0 && bin == 0)
                        break;
                if(bin % 2 == 0)
                        buff[(32-1)-i1] = '0';
                else
                        buff[(32-1)-i1] = '1';
                bin = bin / 2;
        }
        printf(">>>%s\n", buff+(32-1)-i1+1);
}
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて...
通常、2進数は8桁(1バイト分)で扱うことが多いので前のプログラムを改造して8桁分の2進数文字列を作成する関数(bin8)を作ります。
intの値は8桁ずつ4回に分けてbin8関数で処理し表示する必要があります。
bin8関数のポイントは次のようになります。
(1)結果文字列はbin8関数のresult配列に格納します。
(2)result配列はstatic変数にする必要があります。通常の自動変数では関数を終了したときに存在しない領域となってしまいます。
(3)bin8関数の結果は同じ領域に格納されるため連続して呼び出す場合には注意が必要です。
printf("%s %s %s\n", bin8(1), bin8(2), bin8(3));といった使い方はできません。
char    *bin8(int bin);

main(int argc, char *argv[])
{
        int     bin;

        if(argc != 2){
                printf("コマンドの入力形式が間違っています.\n");
                return;
        }
        bin = atoi(argv[1]);
        printf(">>>%s\n", bin8(bin & 0xFF));
        printf(">>>%s\n", bin8((bin >> 8) & 0xFF));
        printf(">>>%s\n", bin8((bin >> 16) & 0xFF));
        printf(">>>%s\n", bin8((bin >> 24) & 0xFF));
}


char    *bin8(int bin)
{
        static char
                result[10];
        int    i1;

        result[8] = '\0';
        for(i1 = 0; i1 < 8; i1++){
                if(bin % 2 == 0)
                        result[(8-1)-i1] = '0';
                else
                        result[(8-1)-i1] = '1';
                bin = bin / 2;
        }
        return(result);
}
Study Cにロードする Study Cにロードし編集する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて... 「run 123」のように実行する必要があるので実行ボタンはありません


[an error occurred while processing this directive]