こんばんは。只今C言語について勉強していてわからなくなってしまったので、質問させていただきました。よろしくお願いします。
設問は....
符号無し整数xを右にnビット回転した値を返す関数rrotateと、左にnビット回転した値を返す関数lrotate
unsigned rrotate(unsigned x, int n){ /* … */ }
unsigned lrotate(unsigned x, int n){ /* … */ }
を作成せよ。
というものなのですが、途中まで自分で作ってみてわからない点は、最下位ビットに1がある時にさらに右にシフトさせると、今度はその1が最上位ビットに移動するということができませんでした。どのような考え方をすればよいのか、わかる方ご指導お願いします(わかりづらかったらすみません。)
c言語 2進数ローテートについて
Re:c言語 2進数ローテートについて
いくつか方法があるとは思いますが、
私のお気に入りはこんな感じです。
私のお気に入りはこんな感じです。
#include <stdio.h> #include <limits.h> int main(void) { unsigned int a = (UINT_MAX >>1)+1; printf("%x",a); return 0; }
Re:c言語 2進数ローテートについて
例によってそのままの答えではなく、C++によるヒントだけ。
なお、これは rrotate だけなので、lrotate は自分で考えてください。
#include <limits> #include <cassert> template <bool LegalType> struct rrotate_helper; template <> struct rrotate_helper<true> { template <typename T> static T f(T x, int n) { const int digits = std::numeric_limits<T>::digits; assert(n >= 0 && n < digits); return (x >> n) | (x << (digits - n)); } }; template <typename T> T rrotate(T x, int n) { typedef std::numeric_limits<T> limits; return rrotate_helper<limits::is_integer && !limits::is_signed>::f(x, n); }C++なので丸写しは意味をなしませんが、じっくり見ると重要なヒントが見えてくるはずです。
なお、これは rrotate だけなので、lrotate は自分で考えてください。
Re:c言語 2進数ローテートについて
質問のヒント、というより答えですが、
最下位(最上位)ビットが 1 のとき、それを最上位(最下位)ビットに移動する方法は、
反転 -> シフト -> 反転
です。
Re:c言語 2進数ローテートについて
では穴埋め問題にでもしましょうか。関数名も適当なのに変えて…
11100101 rrotate 3 = 10111100
10010110 lrotate 5 = 11010010
unsigned int RotateRight(unsigned int index,int count){ return (index/*ここが抜けてまーす*/count/*ここも*/index<<CHAR_BIT*/*ここも抜いてます*/(unsigned int)-count); }回転って言うのはこういうことでしょう?(面倒なので8ビットで考えてます)
11100101 rrotate 3 = 10111100
10010110 lrotate 5 = 11010010
Re:c言語 2進数ローテートについて
ちなみに、一般的には unsigned int 型のビット長は CHAR_BIT * sizeof(unsigned int) では求まりません。
なぜなら、詰め物ビットが存在するかもしれないからです。
なぜなら、詰め物ビットが存在するかもしれないからです。
Re:c言語 2進数ローテートについて
>ちなみに、一般的には unsigned int 型のビット長は CHAR_BIT * sizeof(unsigned int) では求まりません。
それは知りませんでした。それは失礼しました。
それは知りませんでした。それは失礼しました。
Re:c言語 2進数ローテートについて
皆さんいろいろなヒントをありがとうございました。おかげさまで何とか
答えにたどり着きました!!またちょくちょく覗きに来ます!!
答えにたどり着きました!!またちょくちょく覗きに来ます!!