さて、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について解説しましょう。
以下に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進数で表示することができます。
どちらのプログラムも完ぺきとは言えないようです。
それでは、次回の宿題です。
負数が入力されるまで繰返し整数を入力し、負数が入力されたならばLIFO(後入れ先出し)の順番で、入力された整数を表示するプログラムを作成して下さい
⇒解答と解説は次回
Copyright © ITmedia, Inc. All Rights Reserved.