ページ 1 / 1
c言語 2進数ローテートについて
Posted: 2008年1月31日(木) 22:39
by tsurukamepanda
こんばんは。只今C言語について勉強していてわからなくなってしまったので、質問させていただきました。よろしくお願いします。
設問は....
符号無し整数xを右にnビット回転した値を返す関数rrotateと、左にnビット回転した値を返す関数lrotate
unsigned rrotate(unsigned x, int n){ /* … */ }
unsigned lrotate(unsigned x, int n){ /* … */ }
を作成せよ。
というものなのですが、途中まで自分で作ってみてわからない点は、最下位ビットに1がある時にさらに右にシフトさせると、今度はその1が最上位ビットに移動するということができませんでした。どのような考え方をすればよいのか、わかる方ご指導お願いします(わかりづらかったらすみません。)
Re:c言語 2進数ローテートについて
Posted: 2008年1月31日(木) 22:58
by box
> その1が最上位ビットに移動するということができませんでした
その1を何ビットシフトすれば、最上位に移動するでしょうか。
Re:c言語 2進数ローテートについて
Posted: 2008年1月31日(木) 23:12
by 組木紙織
いくつか方法があるとは思いますが、
私のお気に入りはこんな感じです。
#include <stdio.h>
#include <limits.h>
int main(void)
{
unsigned int a = (UINT_MAX >>1)+1;
printf("%x",a);
return 0;
}
Re:c言語 2進数ローテートについて
Posted: 2008年2月01日(金) 10:40
by たかぎ
例によってそのままの答えではなく、C++によるヒントだけ。
#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進数ローテートについて
Posted: 2008年2月01日(金) 12:23
by フリオ
質問のヒント、というより答えですが、
最下位(最上位)ビットが 1 のとき、それを最上位(最下位)ビットに移動する方法は、
反転 -> シフト -> 反転
です。
Re:c言語 2進数ローテートについて
Posted: 2008年2月01日(金) 21:08
by tk-xleader
では穴埋め問題にでもしましょうか。関数名も適当なのに変えて…
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進数ローテートについて
Posted: 2008年2月01日(金) 21:38
by たかぎ
ちなみに、一般的には unsigned int 型のビット長は CHAR_BIT * sizeof(unsigned int) では求まりません。
なぜなら、詰め物ビットが存在するかもしれないからです。
Re:c言語 2進数ローテートについて
Posted: 2008年2月02日(土) 08:43
by tk-xleader
>ちなみに、一般的には unsigned int 型のビット長は CHAR_BIT * sizeof(unsigned int) では求まりません。
それは知りませんでした。それは失礼しました。
Re:c言語 2進数ローテートについて
Posted: 2008年2月03日(日) 10:46
by tsurukamepanda
皆さんいろいろなヒントをありがとうございました。おかげさまで何とか
答えにたどり着きました!!またちょくちょく覗きに来ます!!