ページ 11

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
皆さんいろいろなヒントをありがとうございました。おかげさまで何とか
答えにたどり着きました!!またちょくちょく覗きに来ます!!