- ベストアンサー
符号無し整数xを右にnビット回転
C言語勉強中です。本、例題の中に、 符号無し整数xを右にnビット回転した値を返す関数rrotateと、 左にnビット回転した値を返す関数lrotate unsigned rrotate(unsigned x, int n) unsigned lrotate(unsigned x, int n) を作成せよ。 という例題がありました。 この例題の中の回転とは、どのような意味なのでしょうか? 何をどのようにしたらよいか、問題の意味がわかりません。 解る方教えてください。よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
★既に答えが出ているので『例題』の解き方のヒントをアドバイス ●rrotate(右にnビット回転) (1)符号なし整数『x』を『n』ビット右へシフト移動⇒α (2)符号なし整数『x』をビット長(32Bit)から『n』を引いた分(32-n)のビットを左へシフト移動⇒β (3)上記のα、βの値をビット OR で合成⇒θ (4)合成した『θ』が『右にnビット回転』した値なのでそれを返す。 ●lrotate(左にnビット回転) (1)符号なし整数『x』を『n』ビット左へシフト移動⇒α (2)符号なし整数『x』をビット長(32Bit)から『n』を引いた分(32-n)のビットを右へシフト移動⇒β (3)上記のα、βの値をビット OR で合成⇒θ (4)合成した『θ』が『左にnビット回転』した値なのでそれを返す。 最後に: ・『unsigned』型のビット長に注意して『例題』を解いて下さい。 ・現在のパソコン環境では、『unsigned』型のビット長が『32Bit』、『64Bit』の2つのビット長が 存在します。昔は『16Bit』、『32Bit』の2つの時代でしたね。 余談: ・今年登場した『Windows Vista』も『32Bit』タイプ、『64Bit』タイプの2つがあるようですね。 ・以上。おわり。
その他の回答 (5)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★『CHAR_BIT』について ・1バイトのビット数を定義した記号定数です。 ・前回の『関数とビット列』の質問では、『int_bits』と『count_bits』関数が行っていた ビット長の数が記号定数として定義されているのです。ただし、『CHAR_BIT』は開発環境 が固定化されているため他の環境では正しく動作しない可能性があります。 ・つまり、普通は1バイトが 8 ビットですが、なかには 9 ビットというコンピュータが 存在します。すると、この環境では int型のビット長を『sizeof(int) * CHAR_BIT』で計算 してしまうと『4 * 8』で『32』ビットになります。でも、実際は1バイト 9 ビットですので 『36』ビットと異なります。このため、『CHAR_BIT』記号定数よりも『~0U』としてビット数 を数えた方が正しく動作します。 最後に: ・私も『柴田望洋』さんの本を持っていますが『明解C言語 入門編』ではなくて 『新版 秘伝C言語問答 ポインタ編』です。この本はポインタについていろいろと詳しく 書かれているので『ポインタ』をより深く知りたい場合には役に立つかもしれません。 ・回答者 No.5 の補足から『柴田望洋』さんのホームページを知っていますね。 ・私が持っている本は次の2冊です。 ・http://www.bohyoh.com/Books/HidenPtrA/index.html→『秘伝C言語問答 ポインタ編 / 新版 秘伝C言語問答 ポインタ編』 ・http://www.bohyoh.com/Books/SuperLib/index.html→『C:98スーパーライブラリ / 新版 C:98スーパーライブラリ』 参考に: ・http://www9.plala.or.jp/sgwr-t/index.html→『初心者のためのポイント学習C言語』 ・http://homepage3.nifty.com/mmgames/c_guide/index.html→『苦しんで覚えるC言語』 ・http://www5c.biglobe.ne.jp/~ecb/c/c00.html→『C言語入門』 その他: ・http://ysserve.int-univ.com/sugsi/Lecture/c2/→『C言語(応用編)』図解され分かりやすい ・http://a-gamyl.hp.infoseek.co.jp/Clang/→『C言語例題』解説がほとんどないが参考になる より深くC言語を知るには: ・http://seclan.dll.jp/c99d/→『プログラミング言語 C の新機能』
お礼
いろいろ教えてくださり、本当にありがとうございます。 応用力が全くないため、少しでも違う文脈だけで わからなくなってしまうので、教えていただいたものを いかせるか不安ですが、参考にさせて頂こうと思います。 ありがとうございました。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★『関数とビット列』の質問者さんですね。 ・質問者さんが今使っている『例題』は、もしかして私が昔買った本の 『Cプログラミング言語 第2版 アンサー・ブック』の演習問題の 方ですかね。 ・どうも似たような関数名や例題があります。 ・演習問題もよいですが『演習問題の解答集』という本もありますので お金に余裕があれば買ってみてはどうでしょうか?2,520円です。 ・『解答』だけではなく『解説』もされているので、ここで質問をする 以外にも役に立ちますよ。→2点在庫あり。ご注文はお早めに。だって!
補足
いつも回答ありがとうございます。 私が使っている本は、柴田望洋著の『明解C言語 入門編』です。 http://www.bohyoh.com/Books/MeikaiC01/index.html 知り合いの人に、C言語を勉強していると言ったら、 柴田望洋著のものがいいと教えてもらったので、 図書館で借りてきました。 確かに、図書館で借りた何冊かのC言語の本の中では、一番 わかりやすく、良い本でしたが、 この本の解説では、私の理解力ではわからないところもあり、 また、演習問題の答えや解説がないところが、少し困っています。 それで、皆さんのお力を借りようと書きこみしてみました。 紹介して頂いた本を買うのがBESTだと思うのですが、 とりあえずは、この本で勉強していこうと思っています。 せっかく紹介して頂いたのに、すみません。 これからもお力を貸していただくかもしれませんが、 よろしくおねがいします。
- Tacosan
- ベストアンサー率23% (3656/15482)
しかし, どの時点で出てきたんでしょうか, この例題. 清く正しい C プログラマなら「unsigned のビット長に注意するのは無駄」とばかりに sizeof と CHAR_BIT を使うものだと思うんですが, CHAR_BIT が出てくる本ってどのくらいあるんだろ....
補足
回答ありがとうございます。 c言語勉強中の本を順番にやっていったら、ビット列の問題が 出てきました。 >「unsigned のビット長に注意するのは無駄」とばかりに sizeof と CHAR_BIT を使うものだと とあるのですが、sizeofはわかるのですが、CHAR_BIT とは何でしょうか? まだ本当に初歩の初歩しかやっていないので、未だビット回転と格闘中で、ますますわからなくなるかな…と不安ですが、 どういう意味なのでしょうか?
- driverII
- ベストアンサー率27% (248/913)
回転とは 10101011 を左に1ビットとして 01010111(一番左の1を、右につける) にするということですよ。 詳細はいろいろあるのですが、大筋ではそういうことです。 ようはCPUの命令にそういうのがあるので、それを作れってことですね。 参考URLを「シフト」で検索すると似たようなPGMがあります。 http://wisdom.sakura.ne.jp/programming/cs/cs7.html それからシフトという操作もあります。 前述の例だと 01010110 (一番左の1が消え、右に0をつける) 左に1ビットシフトの例です。
お礼
回答ありがとうございます。 回転の意味わかりました。 ありがとうございます。
- Tacosan
- ベストアンサー率23% (3656/15482)
ただのシフトだと「押し出されたビット」は消えてなくなりますが, 回転だと「押し出されたビット」は反対側から帰ってきます. だから, たとえば 10110100 を右に 3ビット回転させると 10010110 になります. おぉ, ほとんど答えをいってる.
お礼
回答ありがとうございます。 回転の意味わかりました。
お礼
回答ありがとうございます! 解き方のヒントとアドバイスまでつけていただき、おかげで出来ました! ほんとすごいです。ありがとうございました!