- 締切済み
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; }
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- ryozi_1225
- ベストアンサー率62% (5/8)
このC言語のコードは、与えられた2つunsigned char型数値をの二進数表現にして表示するものです。main関数がprintBinary関数に値を渡して呼び出し、printBinary関数は変換後の値を表示します。 ### `printBinary` 関数 - 引数: `unsigned char num` - `unsigned char`型は、0から255までの範囲の数値を保持できる8ビットの無符号整数です。 - 処理内容: 1. 8ビット(バイト)の各ビットを上位ビット(7番目のビット)から順に処理します。 2. このループで、数値`num`を右に`i`ビットシフトします(`num >> i`)。これにより、現在のビットが最下位ビットになります。2進数における1つのビットシフトは、一桁の移動を示しています。つまり、ビットシフトの回数は2で割った回数と考えてもよいでしょう。2でその回数割った時に、その桁の値が幾つになるか(0or1)が出力されるということです。 3. シフトされた値と`0x01`(二進数で`00000001`)をビット単位のAND演算で結合します。これにより、最下位ビット以外は0になり、最下位ビットが現在のビットの値(0または1)になります。まぁ要するに、欲しい桁以外の桁は0とand演算されるようになるから、欲しい桁だけが1とand演算される、欲しい桁だけが出力されるということですね。一桁で0か1かになるわけです。 4. 現在のビット(0または1)をprintします。 これを8桁分forで繰り返すループです ### `main` 関数 - 2つの無符号8ビット整数`num1`(`0xD2`、二進数で`11010010`)と`num2`(`0x5E`、二進数で`01011110`)を定義します。 - これらの数値の二進数表現を印刷するために`printBinary`関数を呼び出します。 ### 実行結果 このコードを実行すると、次のようにそれぞれの数値の二進数表現が表示されます: ``` 0xD2 : 11010010 0x5E : 01011110 ``` ちなみに、元の数値について 10進数だと01234556789のどれかが一桁になるわけですが、0123456789abcdefとすることで一桁に15までの数値を数値を突っ込めるようにしている表記の方法です。 a10 b11 c12 d13 d14 e15 と対応します。 2進数の4桁が0から15まで表現出来るので、この16進数の表記の方法を使えば一桁に2進数の4桁までを書けるということです。こういうわけで、2桁の値が8桁に変換されてるというのがこのコードのやってることです