- ベストアンサー
ビットをローテートするプログラムの解説をお願いします。(C言語)
下記のプログラムは、rotate() を呼び出されるたびに1つずつ左にビットをローテートするものです。 #include <stdio.h> void rotate(unsigned char *c); int main(void) { unsigned char ch; int i; ch = 1; for(i=0; i<16; i++) { rotate(&ch); printf("%u\n", ch); } return 0; } void rotate(unsigned char *c) { union { unsigned char ch[2]; unsigned u; } rot; rot.u = 0; /* 16ビットをクリア */ rot.ch[0] = *c; /* 整数を左にシフト */ rot.u = rot.u << 1; /* ビットがc[1]にシフトしたかどうか確認する。 シフトしていれば、OR演算を実行して他方の端に戻る */ if(rot.ch[1]) rot.ch[0] = rot.ch[0] | 1; *c = rot.ch[0]; } 【質問】 自分で考えてみたので、間違いがあれば、ご指摘お願いします。 --------------------------------------------------------- ch = 1; だから rotate(&ch); で初回実行時に *c に1を渡す。 i=0 のとき、 rot.ch[0] rot.ch[1] 0000 0000 0000 0000 rot.u = 0; rot.u 0000 0001 0000 0000 rot.ch[0] = *c; *c は 1 0000 0010 0000 0000 rot.u = rot.u << 1; if(rot.ch[1]) → 偽 *c = rot.ch[0]; で *c が 0000 0010 すなわち 2 になる。 printf文で「2」を表示。 --------------------------------------------------------- i=1 のとき、 rot.ch[0] rot.ch[1] 0000 0000 0000 0000 rot.u = 0; rot.u 0000 0010 0000 0000 rot.ch[0] = *c; *c は 2 0000 0100 0000 0000 rot.u = rot.u << 1; if(rot.ch[1]) → 偽 *c = rot.ch[0]; で *c が 0000 0100 すなわち 4 になる。 printf文で「4」を表示。 --------------------------------------------------------- i=2 のとき、rot.ch[0] が 0000 1000 で *c が 8 になる。 printf文で「8」を表示。 i=3 のとき、rot.ch[0] が 0001 0000 で *c が 16 になる。 printf文で「16」を表示。 i=4 のとき、rot.ch[0] が 0010 0000 で *c が 32 になる。 printf文で「32」を表示。 i=5 のとき、rot.ch[0] が 0100 0000 で *c が 64 になる。 printf文で「64」を表示。 i=6 のとき、rot.ch[0] が 1000 0000 で *c が 128 になる。 printf文で「128」を表示。 --------------------------------------------------------- i=7 のとき、 【ここからがどうしても分かりません。どうか力をかして頂けないでしょうか?お願いします。】
- みんなの回答 (7)
- 専門家の回答
お礼
2度も回答ありがとうございます! 検索したら、同じ質問をしている人がいました。 もう少し、調べてから質問した方が良かったのかもしれません。ごめんなさい! 質問したローテーションするプログラムは『独習C 第3版』に記載されているものです。 コードのサンプル、今後の参考にさせて頂きます!! いろいろ勉強になりました!! 回答本当にありがとうございました。