• ベストアンサー

符号無し整数xを右にnビット回転

C言語勉強中です。本、例題の中に、 符号無し整数xを右にnビット回転した値を返す関数rrotateと、 左にnビット回転した値を返す関数lrotate unsigned rrotate(unsigned x, int n) unsigned lrotate(unsigned x, int n) を作成せよ。 という例題がありました。 この例題の中の回転とは、どのような意味なのでしょうか? 何をどのようにしたらよいか、問題の意味がわかりません。 解る方教えてください。よろしくお願いします。

  • ki_c
  • お礼率63% (28/44)

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★既に答えが出ているので『例題』の解き方のヒントをアドバイス ●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つがあるようですね。 ・以上。おわり。

ki_c
質問者

お礼

回答ありがとうございます! 解き方のヒントとアドバイスまでつけていただき、おかげで出来ました! ほんとすごいです。ありがとうございました!

その他の回答 (5)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.6

★『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 の新機能』

参考URL:
http://www9.plala.or.jp/sgwr-t/index.html
ki_c
質問者

お礼

いろいろ教えてくださり、本当にありがとうございます。 応用力が全くないため、少しでも違う文脈だけで わからなくなってしまうので、教えていただいたものを いかせるか不安ですが、参考にさせて頂こうと思います。 ありがとうございました。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.5

★『関数とビット列』の質問者さんですね。 ・質問者さんが今使っている『例題』は、もしかして私が昔買った本の  『Cプログラミング言語 第2版 アンサー・ブック』の演習問題の  方ですかね。 ・どうも似たような関数名や例題があります。 ・演習問題もよいですが『演習問題の解答集』という本もありますので  お金に余裕があれば買ってみてはどうでしょうか?2,520円です。 ・『解答』だけではなく『解説』もされているので、ここで質問をする  以外にも役に立ちますよ。→2点在庫あり。ご注文はお早めに。だって!

参考URL:
http://www.amazon.co.jp/gp/product/4320027485
ki_c
質問者

補足

いつも回答ありがとうございます。 私が使っている本は、柴田望洋著の『明解C言語 入門編』です。 http://www.bohyoh.com/Books/MeikaiC01/index.html 知り合いの人に、C言語を勉強していると言ったら、 柴田望洋著のものがいいと教えてもらったので、 図書館で借りてきました。 確かに、図書館で借りた何冊かのC言語の本の中では、一番 わかりやすく、良い本でしたが、 この本の解説では、私の理解力ではわからないところもあり、 また、演習問題の答えや解説がないところが、少し困っています。 それで、皆さんのお力を借りようと書きこみしてみました。 紹介して頂いた本を買うのがBESTだと思うのですが、 とりあえずは、この本で勉強していこうと思っています。 せっかく紹介して頂いたのに、すみません。 これからもお力を貸していただくかもしれませんが、 よろしくおねがいします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

しかし, どの時点で出てきたんでしょうか, この例題. 清く正しい C プログラマなら「unsigned のビット長に注意するのは無駄」とばかりに sizeof と CHAR_BIT を使うものだと思うんですが, CHAR_BIT が出てくる本ってどのくらいあるんだろ....

ki_c
質問者

補足

回答ありがとうございます。 c言語勉強中の本を順番にやっていったら、ビット列の問題が 出てきました。 >「unsigned のビット長に注意するのは無駄」とばかりに sizeof と CHAR_BIT を使うものだと とあるのですが、sizeofはわかるのですが、CHAR_BIT とは何でしょうか? まだ本当に初歩の初歩しかやっていないので、未だビット回転と格闘中で、ますますわからなくなるかな…と不安ですが、 どういう意味なのでしょうか?

  • driverII
  • ベストアンサー率27% (248/913)
回答No.2

回転とは 10101011 を左に1ビットとして 01010111(一番左の1を、右につける) にするということですよ。 詳細はいろいろあるのですが、大筋ではそういうことです。 ようはCPUの命令にそういうのがあるので、それを作れってことですね。 参考URLを「シフト」で検索すると似たようなPGMがあります。 http://wisdom.sakura.ne.jp/programming/cs/cs7.html それからシフトという操作もあります。 前述の例だと 01010110 (一番左の1が消え、右に0をつける) 左に1ビットシフトの例です。

参考URL:
http://bbslog.realint.com/?serverid=3&bbsid=pointc2&page=3
ki_c
質問者

お礼

回答ありがとうございます。 回転の意味わかりました。 ありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

ただのシフトだと「押し出されたビット」は消えてなくなりますが, 回転だと「押し出されたビット」は反対側から帰ってきます. だから, たとえば 10110100 を右に 3ビット回転させると 10010110 になります. おぉ, ほとんど答えをいってる.

ki_c
質問者

お礼

回答ありがとうございます。 回転の意味わかりました。

関連するQ&A

  • 9ビットの2進数を符号付整数…

    問題の意味がわからないのですが、どう解けばいいですか? 9ビットの2進数を符号付の整数とみなしたときの数値の範囲を、10進数で下限~上限の形で示せ。符号は2の補数。

  • C で、a、b、c が16ビット符号無し整数のとき

    C で、a、b、c が16ビット符号無し整数のとき、 a = 0x7FFF * b / c; の途中結果の 0x7FFF * b は 16ビット符号無し整数として処理されるのですか。32ビットで処理してくれたら便利なのですが。

  • n進数の値を10進数の値に変換するには?

    こんにちは。 C言語において、n進数の値を10進数の値に変換する方法を考えています。 例えば、2進数の101を、10進数で表すと5になります。 これを関数化し、 n_to_m(int x, unsigned n); といったプロトタイプで、 渡された整数x(n進数)を、10進数での値に変換する関数を作りたいのです。 逆に、10進数の値を、n進数の値に変換する関数も一緒に作りたいと考えています。 何かいい方法を思いついた方がいらっしゃれば、是非アドバイスを頂きたいと思います。 では、よろしくお願い致します。

  • 異なるn個の整数からr個の整数を取り出す組み合わせ

    異なるn個の整数からr個の整数を取り出す組み合わせの数 nCrを求める関数 int combination(int n, int r){ /* ・・・ */} を作成せよ。なおnCrは以下のように定義される。 nCr = n-1Cr-1 + n-1Cr (ただし nC0 = nCn =1、nC1 =n ) (新版 明解C言語 入門編(柴田望洋 著) P.197 演習8-6) というので答えが int combination(int n, int r) { if((n>r) && (r>0)){ return combination(n-1,r-1) + combination(n-1,r); } else if(n==r || r==0){ return 1; } } ・という風になると教えてもらったのですがなぜこうなるのかが分かりません。 ・else if(n==r || r==0){ というのは削っても正常に動きますが、必要な物なのでしょうか? ・またifを使うときは if→eise if →else の順に使って 2つの時は if→else と使っていたのですが 上のものはif→else ifと書いています。 加えてelse(n==r || r==0){ と書いたらコンパイルエラーになってしまいました なぜelse ifと書くのでしょうか? 以上3点について教えてください。よろしくお願いいたします。

  • 連続したn個の整数の積

    ひき続いたn個の整数の積のなかには、nの倍数が含まれることがわからないので質問します。問題は、 整数a,bを係数とする2次式f(x)=x^2+ax+bを考える。f(α)=0となるような有理数αが存在するとき、以下のことを証明せよ。 (1)αは整数である。(2)任意の整数lと任意の自然数nに対して、n個の整数f(l),f(l+1),・・・,f(l+n-1)のうち少なくとも1つはnで割り切れる。 (1)α=m/n(m,nは互いに素な整数)とおくと条件より (m/n)^2+a(m/n)+b=0, m^2/n=-(am+bn) m^2はnで割り切れるが,m,nは互いに素だから n=±1しかない。ゆえにα=±mとなり、αは整数である。 (2)f(α)=0だから、f(x)=x^2+ax+b=0となる2次方程式は、x=αなる解をもつ。ほかの解をβとすれば、解と係数の関係からα+β=-a,β=-a-αよりβも整数である。ゆえにf(x)はこの2整数α,βを用いて、f(x)=(x-α)(x-β)と因数分解できる。したがってf(l)=(l-α)(l-β)となりf(l)はl-αで割り切れる。同様に、 f(l+1)はl+1-α で f(l+2)はl+2-α   ・・・ f(l+n-1)はl+n-1-α で割り切れる。 ゆえにf(l)f(l+1)f(l+2)・・・f(l+n-1)はそれらの積 (l-α)(l+1-α)(l+2-α)・・・(l+n-1-α)= (l-α)(l-α+1)(l-α+2)・・・(l-α+n-1)で割り切れる。 ここがわからないところです。 l-αからはじまる引き続いたn個の整数の積だから、どこかにnの倍数がある。 自分はl-α=-3 n=4で計算をしたら、 -3,-2,-1,0 となり0が4で割り切れるのかと疑問に思ったり、 他の数を代入して計算してみても、ひき続いたn個の整数の積のなかには、nの倍数が含まれることが実感できませんでした。 解答の続きは、よってn個の整数f(l),f(l+1),・・・,f(l+n-1)のうち少なくとも1つはnで割り切れる。でした。 どなたか、ひき続いたn個の整数の積のなかには、nの倍数が含まれることを証明してください。お願いします。

  • フィボナッチ数列X(n+1)= X(n+1)+X(n) (X(1)=X

    フィボナッチ数列X(n+1)= X(n+1)+X(n) (X(1)=X(2)=1) の1項X(1)からX(30)までの値を表示するプログラムを再帰関数を使って作る方法を教えてください。 再帰関数がよくわかりません。

  •    #include<stdio.h>

       #include<stdio.h> #include<math.h> int main(void) { int i,n,limit; printf("data? "); scanf("%d",&n); i(n>=2){ limit=int)sqrt(n); for(i=limit;i1;i--){ if(n%i==0) break; } if(i==1) printf("素数\n); else printf("素数でない\n"); } return 0; } というプログラムがあるのですが、それを改良して int型(符号付32ビット整数)および、unsigned int型(符号なし32ビット整数)のそれぞれの最大の素数を求めよという問題があり、ただし、エラトステネスのふるいは使わずに、上のプログラムを改良してみよという問題がどっかにあったんですが、全然わからないので、教えてください。

  • x^n+y^n=1以外でn=2のとき円を表す関数の種類

    x^n+y^n=1 以外にも(x+y)^n+(x-y)^n=1や (x+y)^n+(y-x)^n=1はnが2のときに円を表しますが、それ以外の数ではグラフの形が違うようです(回転している?)。このようにnが2のときに円を表す関数というのは他にも無数に作れるのでしょうか。

  • c言語による2のべき乗

    右、左シフトと2のべき乗による乗除算が同じことを証明するプログラムを作っているのですがうまくいきません。 プログラムを載せるのでどこが間違っているのかご教授お願いします。 #include <stdio.h> int count_bits(unsigned x){ int count = 0; while(x){ if(x&1U) count++; x>>=1; } return(count); } int int_bits(void){ return(count_bits(~0U)); } void print_bits(unsigned x){ int i; for(i=int_bits()-1; i>=0; i--) putchar(((x>>i)&1U) ? '1' : '0'); } int main(void){ unsigned nx, no, n1, n2; printf("非負の整数を入力してください:"); scanf("%u", &nx); printf("何ビットシフトしますか?:"); scanf("%u", &no); n1=nx * (2^no); n2=nx / (2^no); printf("\n整数 = "); print_bits(nx); printf("\n左にシフトした値 = "); print_bits(nx << no); printf("\n右にシフトした値 = "); print_bits(nx >> no); printf("\n2のべき乗で乗算した値 = "); print_bits(n1); printf("\n2のべき乗で除算した値 = "); print_bits(n2); putchar('\n'); return(0); }

  • Excel関数 16bit→32bi符号付き整数

    お世話になります。 Excel2010にて、16bit符号付き整数の上位・下位の値が元データとしてあり、 それを32bit符号付き整数に関数を使って変換したいのですが、方法がわからず、質問させて頂きます。 例 セルA1に下位用 -1640 セルA2に上位用 -1 の時に セルA3に32bit符号付き整数表示 わかられます方、ご助力のほどよろしくお願い致します。

専門家に質問してみよう