こんばんは。只今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 のとき、それを最上位(最下位)ビットに移動する方法は、
反転 -> シフト -> 反転
です。
-
tk-xleader
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) では求まりません。
なぜなら、詰め物ビットが存在するかもしれないからです。
なぜなら、詰め物ビットが存在するかもしれないからです。
-
tk-xleader
Re:c言語 2進数ローテートについて
>ちなみに、一般的には unsigned int 型のビット長は CHAR_BIT * sizeof(unsigned int) では求まりません。
それは知りませんでした。それは失礼しました。
それは知りませんでした。それは失礼しました。
-
tsurukamepanda
Re:c言語 2進数ローテートについて
皆さんいろいろなヒントをありがとうございました。おかげさまで何とか
答えにたどり着きました!!またちょくちょく覗きに来ます!!
答えにたどり着きました!!またちょくちょく覗きに来ます!!