• ベストアンサー

バイナリ表記を表示するコードが分かりません(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」とすることで、バイナリ表記が表示できるのでしょうか? どなたか教えて頂けないでしょうか?お願いします。

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

  • ベストアンサー
noname#246547
noname#246547
回答No.2

>これを繰り返すと、バイナリ表記になるんですね?※1 'A'を入力したならば、 出力として '01000001'   ←バイナリ表記 が表示されます。 念のため確認ですが、※1で疑問符がついていますが、「バイナリ表記」って16進のことを指して話していらっしゃいませんよね? C言語のコンパイル環境があるならば、 コードを実行してみてみるのが手っ取り早いと思います。 もし、'A'を16進で表示させたいのであれば、 シフト演算を使用することになります。 ちなみに表示結果は "41" ですね。

Guchiken
質問者

お礼

>「バイナリ表記」って16進のことを指して話していらっしゃいませんよね? はい。2進数での表記のことを質問したつもりですが… ソースコードをコンパイルすると、「A」と入力した場合、 0 1 0 0 0 0 0 1 とエコーされて表示されます。 確認ですが、ANo.1でのお礼に書いた解釈であっているんですよね?

その他の回答 (2)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

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

Guchiken
質問者

お礼

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

noname#246547
noname#246547
回答No.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回繰り返すことでバイナリ表記が表示できる」です。

Guchiken
質問者

お礼

さっそくの回答ありがとうございます! 「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」を出力。 これを繰り返すと、バイナリ表記になるんですね?

関連するQ&A

  • C言語

    入力した文字列と文字列'x'を受け取り、'x'の位置のポインタを返すのですが、例えば、saxcvと入力すると、xcvと表示されるのですが、このソースだと、saxcvと全部表示されてしまいます。分からないので、教えてください。宜しくお願いします。 #include <stdio.h> char *a(char *sew) { char *p=sew; while (*sew != 'x') { sew++; } return(p); } int main(void) { char str[21] ={'\0'}; int i=0,no=0; char ch; printf("文字を入力してください:"); while (i<21) { ch=getchar(); if (ch=='\n') {break;} else if (ch != '\0' && ch != '\0') { str[i] =ch; i++; } } for(i=0; i<20; i++) { if(str[i]=='x') { printf("'x'以降は%sです。\n", a(str)); no=1; break; } } if (no==0) printf("'x'は見つかりませんでした。"); return (0); }

  • C言語の質問です

    下記のプログラムはテキストファイルを読み込み、AからZまでの文字(小文字、大文字は区別しない)がそれぞれ何回 現れたかを数えるプログラムです。 #include <stdio.h> #include <stdlib.h> #include <ctype.h> int count[26]; int main(int argc, char *argv[]) { FILE *fp; char ch; int i; /* ファイル名の指定を調べる */ if(argc!=2) { printf("ファイル名の指定がありません\n"); exit(1); } if((fp = fopen(argv[1], "r"))==NULL) { printf("ファイルを開くことができません\n"); exit(1); } while((ch=fgetc(fp))!=EOF) { ch = toupper(ch); if(ch>='A' && ch<='Z') count[ch-'A']++; } for(i=0; i<26; i++) printf("%c は %d 回出現\n", i+'A', count[i]); fclose(fp); return 0; } 1)int count[26]; で、なぜ26なのかが分かりません。 2)count[ch-'A']++; はどういう動作をするのか詳しく教えてほしいです。 3)よって、for文がどういう動作で表示しているのかが分かりません。 未熟者の私ですが、どなたか教えていただけないでしょうか?

  • C言語プログラム

    2つの整数を入力させ、それらが等しい場合hitoshii、異なる場合にはhitoshikunaiと出力するプログラムを作りたいのですが、うまくいきません。間違っているところを教えてください。 #include<stdio.h> #include<conio.h> void main() { printf("整数を入力してください:"); int number1; scanf("%d",number1); printf("整数を入力してください:"); int number2; scanf("%d",number2); if(number1==number2) { printf("hitoshii"); } else { printf("hitoshikunai"); } getch(); }

  • C言語 

    #include <stdio.h> int main(void) { int ch; int count = 1; while( (ch = getchar()) != EOF) { if(ch == '\n') count++; } printf("行数は%dです。", count); return(0); } このコードの if(ch == '\n') count++; の部分がわかりません。 aを入力したとしてchにaが入っても、a=='\n'にはならないと思うのですが、実行して見ると行数がカウントされます。 (ch=='\n')というのはchと改行が同じなら行数を1増やすと言う事になると思うのですがよくわかりません。 教えてくださいm(_ _ )m

  • C言語文字数4つカウント

    こんにちは。大学の課題で「キーボードから入力した文字数に含まれる'h''o''g''e'の4つの文字数をカウントする関数を含むプログラムを完成させよ」という課題がありました。なかなかできず現段階では以下のようになっています。どうすれば問題文のように実行できますか? #include <stdio.h> char str_chnum(const char str[], int ch) { int count = 0; int i; for(i = 0; str[i] != '\0'; i++) { if(str[i] == ch) count++; } return(count); } int main(void) { char str[128]; int ch; printf("文字列を入力してください:"); scanf("%s", str); printf("検索する文字を入力してください:"); scanf(" %c", &ch); printf("%cは%d個ありました。\n", ch, str_chnum(str, ch)); return(0); }

  • C言語でタイミングを合わせるゲームを作っているのですが・・・。【getch()】

    C言語で壁に向かって衝突していくボールをタイミングよくスペースキーを押すことで打ち返すプログラムを作っています(多分実行しないと分かりにくいかも)。 そこでキーの入力にgetch()関数を使っていますが、これだと何かキーが入力されるまで永遠と待ち続けてしまうので、タイミングが100%合ってしまいます。 そこで指定された秒数だけキーの入力を受け付けるような方法を探しているのですが、そのようなものはあるのでしょうか? #include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h> #include <windows.h> int main(void){ int key=0,ballichi=0,i,i2; system("cls");//画面の初期化 for(i=0;i<10;i++){ for(i2=0;i2<10;i2++){ if(ballichi==i2){printf(" o"); }else{printf(" ");} } printf("|壁"); if(i==9){ key = getch(); //キーから一文字入力 switch (key) { /* キー入力チェック */ case ' ': printf("スペースキーが押されました"); break; } } Sleep(500); ballichi++; system("cls"); } return 0; }

  • C言語

    文字列を逆順にするプログラムを考えているのですが分かりません。(例)qwerならrewqです。入力終了は、EOFです。考えたのですが、分かりません。(コンパイルエラーです。)教えてください。宜しくお願いします。#include <stdio.h> unsigned str_length(const char str[]) { unsigned len=0; while (str[len]) len++; return (len); } void put_rstring(const char str[]) { unsigned i = str_length(str): while (i-- >0) putchar(str[i]); } int main(void) { char str[30]; int ch; printf("文字列を入力\n"); /* ----この文字列を入力したあとに、Ctrl+Zを押すと、逆から表示               で反対から、文字列が表示----*/ while (1) { ch=getchar(); if (ch==EOF) break; } printf("逆から表示"); put_rstring(str); puts("です。"); return(0); }

  • C言語のコードについて

    C言語の問題なのですか、作成したのですが内容がわからないです。 コードをわかりやすく解説していただけると嬉しいです。 #include <stdio.h> void printBinary(unsigned char num) { int i ; /*①上位ビットから順に表示する*/ for(i = 7 ; i >= 0; i--) { /*②シフトとマスクを使用しています。*/ printf("%d", (num>>i) &0x01 ); } printf("\n"); } int main(void) { unsigned char num1 = 0xD2;/*11010010*/ unsigned char num2 = 0x5E;/*01011110*/ printf("0xD2 : "); printBinary(num1); printf("0x5E : "); printBinary(num2); return 0; }

  • これのどこがおかしいのでしょうか?

    文字を読み取って逆の順序表示するというのを作っているんですが、 コンパイルして実行すると、文字入力できずに終了してしまいます 自分が見る限りではどこがおかしいのかわかりません>< どうすればいいのでしょうか? #include <stdio.h> #include <conio.h> int main (void) { int a; char ch[31]; printf("文字列を読み取ります。入力してください。\n"); printf("30字まで読み取ります"); for(a = 0; a == 31; a++){ ch[a] = getche(); if(ch[a] == '\r'){ a = a; break; } if(a == 30) a = a; } printf("\n"); for(;a > 0;a--) { printf("%c ",ch[a]);  }   return 0; }

  • なぜかうまく表示されません(原因不明で困ってます)。

    キーを入力するとその入力された文字を表示する、 という単純なプログラムを作成しました。 そこで次のソースを見ていただきたいのですが、 下のこの状態ではうまくいきます。 ところが、余計についているはずの「int t;」を取ると、 表示される文字に余計なものがくっついてきてしまいます。 プログラムをどうみても「t」を使っている箇所はなく、 原因がさっぱりつかめません。 ソースの解読、大変お手数をおかけしますが、 原因を教えていただけないでしょうか。 よろしくお願いいたします。 ---------以下ソース------------- #include <stdio.h> #include <string.h> #include <conio.h> int main(void) { while(1) { char i[40]; int t; i[0]=getch(); if(strcmp(i,"q")==0 || strcmp(i,"Q")==0) break; printf("%s ",i); } return 0; }

専門家に質問してみよう