c言語 2進数ローテートについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tsurukamepanda

c言語 2進数ローテートについて

#1

投稿記事 by tsurukamepanda » 17年前

こんばんは。只今C言語について勉強していてわからなくなってしまったので、質問させていただきました。よろしくお願いします。

設問は....


符号無し整数xを右にnビット回転した値を返す関数rrotateと、左にnビット回転した値を返す関数lrotate
 unsigned rrotate(unsigned x, int n){ /* … */ }
 unsigned lrotate(unsigned x, int n){ /* … */ }
を作成せよ。


というものなのですが、途中まで自分で作ってみてわからない点は、最下位ビットに1がある時にさらに右にシフトさせると、今度はその1が最上位ビットに移動するということができませんでした。どのような考え方をすればよいのか、わかる方ご指導お願いします(わかりづらかったらすみません。)

box

Re:c言語 2進数ローテートについて

#2

投稿記事 by box » 17年前

> その1が最上位ビットに移動するということができませんでした

その1を何ビットシフトすれば、最上位に移動するでしょうか。

組木紙織

Re:c言語 2進数ローテートについて

#3

投稿記事 by 組木紙織 » 17年前

いくつか方法があるとは思いますが、
私のお気に入りはこんな感じです。
#include <stdio.h>
#include <limits.h>

int main(void)
{
	unsigned int a = (UINT_MAX >>1)+1;
	printf("%x",a);

	return 0;
}

たかぎ

Re:c言語 2進数ローテートについて

#4

投稿記事 by たかぎ » 17年前

例によってそのままの答えではなく、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進数ローテートについて

#5

投稿記事 by フリオ » 17年前

 
 質問のヒント、というより答えですが、
最下位(最上位)ビットが 1 のとき、それを最上位(最下位)ビットに移動する方法は、

反転 -> シフト -> 反転

です。
 

tk-xleader

Re:c言語 2進数ローテートについて

#6

投稿記事 by tk-xleader » 17年前

では穴埋め問題にでもしましょうか。関数名も適当なのに変えて…
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進数ローテートについて

#7

投稿記事 by たかぎ » 17年前

ちなみに、一般的には unsigned int 型のビット長は CHAR_BIT * sizeof(unsigned int) では求まりません。
なぜなら、詰め物ビットが存在するかもしれないからです。

tk-xleader

Re:c言語 2進数ローテートについて

#8

投稿記事 by tk-xleader » 17年前

>ちなみに、一般的には unsigned int 型のビット長は CHAR_BIT * sizeof(unsigned int) では求まりません。

それは知りませんでした。それは失礼しました。

tsurukamepanda

Re:c言語 2進数ローテートについて

#9

投稿記事 by tsurukamepanda » 17年前

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

閉鎖

“C言語何でも質問掲示板” へ戻る