1

私はビットローテーター関数を書こうとしています.sizeof演算子をより明確にしようとしています. どのタイプの数値オブジェクトを回転させる必要があるのか​​わからないので、 sizeof 演算子を使用する必要があると仮定します

unsigned rotator(unsigned object, int count)

object は回転するオブジェクトで、count は移動するビット数です。8ビットの数値がある場合、最初に回転する実際のビット数を決定することを想像しています(たとえば、人はcount = 20を作成できるため、次のようにします:

int actualBitRotation;
if (count > sizeof(object)) {
    actualBitRotation = count % sizeof(object);

しかし、私は sizeof をまだ正しく理解していないと思います。私はそれについてオンラインのリソースを読んでみましたが、別の問題についてこのボードからいくつかの助けを得ましたが、私はそれを理解していないと思います. sizeof がオブジェクトのバイト数を返すことはわかっているので、含めて代わりにもっと似たようなことをしますか

int actualBitRotation;
if (count > (sizeof(object) * CHAR_BIT) {
    actualBitRotation = count % (sizeof(object) * CHAR_BIT);
}

ありがとう!

4

2 に答える 2

3

sizeof() はバイト数を返すため、CHAR_BIT を掛けてビット数を取得する必要があります。

template<typename T> T bitrot(T& t,size_t bits) {
   bits %= (sizeof(T)*CHAR_BIT);
   return ((t >> (sizeof(T)*CHAR_BIT)-bits) | (t << bits));
}

明確にするために、変数のビット数を超えるシフト操作は常に避ける必要があります。結果はプロセッサとコンパイラに依存します。

于 2010-01-19T23:45:05.893 に答える
0

どうですか:

union hack {
    int asSigned;
    unsigned asUnsigned;
};
hack top, bottom;
int realBitCount = count % (sizeof(T)*8);
top.asSigned = (realBitCount == 0) ? 0 : -(1 << (realBitCount-1));
bottom.asUnsigned = 0xFFFFFFFF ^ top.asUnsigned;

top.asUnsigned &= object;
bottom.asUnsigned &= object;
return static_cast<T>( (bottom.asUnsigned << realBitCount) | (top.asUnsigned >> (sizeof(T)-realBitCount)) );
于 2011-09-13T00:34:46.213 に答える