みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

バイナリ表記を表示するコードが分かりません(C言語)

下記のプログラムはビットごとの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」とすることで、バイナリ表記が表示できるのでしょうか?
どなたか教えて頂けないでしょうか?お願いします。

投稿日時 - 2008-01-06 12:45:16

QNo.3654590

すぐに回答ほしいです

質問者が選んだベストアンサー

>これを繰り返すと、バイナリ表記になるんですね?※1
'A'を入力したならば、
出力として
'01000001'   ←バイナリ表記
が表示されます。

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

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

投稿日時 - 2008-01-07 10:02:49

お礼

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

0 1 0 0 0 0 0 1

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

投稿日時 - 2008-01-07 10:51:34

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

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

投稿日時 - 2008-01-07 12:14:58

お礼

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

投稿日時 - 2008-01-07 18:45:17

ANo.1

たとえば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回繰り返すことでバイナリ表記が表示できる」です。

投稿日時 - 2008-01-06 13:10:42

お礼

さっそくの回答ありがとうございます!
「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:24

あなたにオススメの質問