連載
» 2014年08月07日 11時00分 公開

【問題7】10進数を2進数に変換するプログラム完全マスター! 組み込みC言語プログラミング(8)(2/2 ページ)

[横田一弘 埼玉県立新座総合技術高等学校 教諭,ITmedia]
前のページへ 1|2       

C言語の「整数」は2進数

 さて、dec2bin.cは数理的に10進数を2進数に変換するものでした。しかしコンピュータの特性をうまく使うと、もっと簡単に2進数を求めることができます。

 実は、C言語で「整数」はコンピュータの内部では2進数であることが約束されています。これを応用すると、プログラムは次のようにも作ることができます。

#include <stdio.h>
 
int main(void)
{
 int n, i;
 
 printf("数を入力してください->");
 scanf("%d", &n);
 for (i = 0x8000; i; i /= 2) {
  if (n & i) putchar('1');
  else putchar('0');
 }
 putchar('\n');
}
dec2bin2.c

 dec2bin2.cを実行すると、次のような結果になります。

photo dec2bin2.cの実行結果

 それでは、dec2bin2.cについて解説しましょう。

 以下にdec2bin2.cのフローチャートを示します。

photo dec2bin2.cのフローチャート

 dec2bin2.cはfor文(ループ)の中にif文(選択)が入ったかたちをしています。

 このif文の条件

 n & i

 の & は「ビット毎の論理積」を行う演算子で、1ビットずつ、nとiの論理積を計算します。

 ここでiが(8000)16の場合、iはコンピュータ内部で(1000000000000000)2と扱われます。ビット毎の論理積(&)は「xに0をANDすると0になる。xに1をANDするとxになる。」計算を行うため、nと(8000)16との論理積(&)は、nの215以外の位のビットをすべて0にし、215の位のビットをそのまま残す結果となります。

 iはfor文の繰返しを制御する変数でもあり、初期値は(8000)16、繰返し毎に2で割り、iが0になるまで繰返します。つまりこのfor文ではiが(8000)16、(4000)16、(2000)16…、1と変化していきます。

 if文で「nとiのビット毎の論理積(&)」の結果が0でなければ‘1’を表示し、0ならば‘0’を表示することで、nを2進数表示しているのです。

 それでは、もう一度、dec2bin.cとdec2bin2.cの実行結果を比較してみると、dec2bin.cの2進数表示では、最も左の桁は必ず1から表示されます。しかし、dec2bin.cで0以下の数を入力すると、まったく計算が行われません。

 これに対しdec2bin2.cの計算結果は、桁が16ビットに固定され左の桁のゼロ抑制は行われません。その代り、0や負数も2進数で表示することができます。

 どちらのプログラムも完ぺきとは言えないようです。


問題8:「後入れ後出し」で入力された数を表示する

 それでは、次回の宿題です。

問題8:

負数が入力されるまで繰返し整数を入力し、負数が入力されたならばLIFO(後入れ先出し)の順番で、入力された整数を表示するプログラムを作成して下さい


⇒解答と解説は次回



前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.