dポイントプレゼントキャンペーン実施中!

下記のプログラムはビットごとのANDを使って、
キーボードから入力された文字のASCIIコードをバイナリ表記で表示します。

#include <stdio.h>
#include <conio.h>

int main(void)
{
char ch;
int i;

printf("文字を入力してください: ");
ch = getche();
printf("\n");

/* バイナリ表記を表示する */
for(i=128; i>0; i=i/2)
if(i & ch) printf("1 ");
else printf("0 ");

return 0;
}

【質問】
「バイナリ表記を表示する」部分のコードで、
1バイト(8bit)の最上位ビットは128(2の7乗)の重みがあり、それを初期値に与えて、
「i=i/2」で64,32,16,8,4,2,1と重みが下がっていくというのは分かりますが、
if(i & ch) で、どうして「i & ch」とすることで、バイナリ表記が表示できるのでしょうか?
どなたか教えて頂けないでしょうか?お願いします。

A 回答 (3件)

>これを繰り返すと、バイナリ表記になるんですね?※1


'A'を入力したならば、
出力として
'01000001'   ←バイナリ表記
が表示されます。

念のため確認ですが、※1で疑問符がついていますが、「バイナリ表記」って16進のことを指して話していらっしゃいませんよね?
C言語のコンパイル環境があるならば、
コードを実行してみてみるのが手っ取り早いと思います。

もし、'A'を16進で表示させたいのであれば、
シフト演算を使用することになります。
ちなみに表示結果は
"41"
ですね。
    • good
    • 1
この回答へのお礼

>「バイナリ表記」って16進のことを指して話していらっしゃいませんよね?
はい。2進数での表記のことを質問したつもりですが…
ソースコードをコンパイルすると、「A」と入力した場合、

0 1 0 0 0 0 0 1

とエコーされて表示されます。
確認ですが、ANo.1でのお礼に書いた解釈であっているんですよね?

お礼日時:2008/01/07 10:51

>確認ですが、ANo.1でのお礼に書いた解釈であっているんですよね?


はい、あってますよ。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!!
本当にこの解釈であっているのか不安だったため、安心しました!
専門家の方の回答があると心強いです!!
回答本当にありがとうございました。

お礼日時:2008/01/07 18:45

たとえばiが128(最上位BITが1)の場合、


chと論理積(&)をとることでchの最上位BITが1であるかを確認できます。
chの最上位BITが1であった場合、この論理積は「真」となり
printf("1")が実行され”1”が画面に出力されます。
「偽」であった場合、”0”が出力され、
この作業を最上位BITから最下位BITまで8回繰り返すことで、
画面上に”1”または”0”の値で構成されたの8桁の数値(バイナリ表記)が表示されます。

よって、
>「i & ch」とすることで、バイナリ表記が表示できるのでしょうか?
は、「「i & ch」を8回繰り返すことでバイナリ表記が表示できる」です。
    • good
    • 0
この回答へのお礼

さっそくの回答ありがとうございます!
「ch = getche();」で、仮に「A」と入力した場合、
「A」の文字コードは65で2進数になおすと01000001になって、

「i & ch」はi=128のとき、

01000001(ch)
10000000(i)
---------------
00000000 論理積

になって0(偽)だから「0」を出力。

i=64のとき、

01000001(ch)
01000000(i)
---------------
01000000 論理積

になって64(0以外、真)だから「1」を出力。

i=32のとき、

01000001(ch)
00100000(i)
---------------
00000000 論理積

になって0(偽)だから「0」を出力。
これを繰り返すと、バイナリ表記になるんですね?

お礼日時:2008/01/06 13:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!