そうでない場合はFALSEを返しますが、希望する結果を得るために必要な最小回転数も計算し、その値をshift
に格納します。つまり、shift = shift % size_of_integer_data_type
を計算します。 たとえば、32ビット整数の場合、32ビットで回転すると何も起こりません。それを64,96、または32の他の倍数で回転すると、何も実行されません。私たちの回転の効果が何もしなければ、私たちは多くの時間を節約し、ちょうど早く終了します。
ただし、必要以上に多くの作業を指定する場合もあります。 32ビット整数の場合は、1ビットだけ回転すると33ビット、65ビット、97ビットなどと同じ効果があります。このコードはこの事実を認識しているので、shiftを97 shift=1
を再割り当てし、余分な回転を取り除きます。
文sizeof(value)*8 - 1
は、value
の表現のビット数より1少ない値を返します。たとえば、sizeof(value)
が4(32ビット整数のシステムの場合)と評価される場合は、4*8 - 1 = 31
となります。
&=
オペレータは、ビット単位のAND-割り当てとなります。これは、shift
とsizeof(value)*8 - 1
のビット単位のANDを行い、その結果をshift
に割り当てることを意味します。前述のように、その式の右辺は、value
のビット数から1を引いたものに等しくなります。したがって、これは、順番にshift = shift % size_of_integer_data_type
を計算する効果を有するvalue
の表現のサイズよりも大きいshift
の全てのビットをマスキングする効果を有します。
具体的には、32ビットのケースを再考。前と同様に、sizeof(value)*8-1
は31と評価されます。ビット単位で、この値は0000 0000 0000 0000 0000 0000 0001 1111
です。その値はshift
とビット単位でANDされます。 shift
の6番目から32番目のビットは0に設定され、1番目から5番目のビットは変更されません。 97回の回転を指定すると、結果は1になります。
0000 0000 0000 0000 0000 0000 0110 0001 (97)
& 0000 0000 0000 0000 0000 0000 0001 1111 (31)
=========================================
0000 0000 0000 0000 0000 0000 0000 0001 (1)
ここで最後に行うことは、Cでは割り当てステートメントの戻り値が割り当てられた値であることを思い出すことです。したがって、新しい値shift
がゼロであれば、すぐに戻ります。それ以外の場合は、処理を続行します。
2行目:
return (value << shift) | (value >> (sizeof(value)*8 - shift));
Cは、(それだけシフトを左右している)回転演算子を持っていないので、我々は別々に下位ビットと上位ビットを計算する必要があり、かつビットワイズORで結合します。この行は、それぞれの面を別々に計算する単純な問題です。
声明value << shift
は、上位ビットを計算します。これは、ビットパターンを左にshift
の場所にシフトします。もう1つの文は、ビットパターンを右にsize_of_integer_type - shift
ビットだけシフトすることによって下位ビットを計算します。これは、例では分かりやすいものです。
value
は小数点値65535を持っていることとshift
は、値26が次に開始値があるしていると仮定します。
0000 0000 0000 0000 1111 1111 1111 1111 (65535)
左シフトが私たちを与える:
1111 1100 0000 0000 0000 0000 0000 0000 (65535 << 26)
右シフトが与えます私たち:
0000 0000 0000 0000 0000 0011 1111 1111 (65535 >> 6)
ビットワイズORコムあなたはこのコードを再書き込みと同じ正しい結果を得ることができ
1111 1100 0000 0000 0000 0000 0000 0000 (65535 << 26)
| 0000 0000 0000 0000 0000 0011 1111 1111 (65535 >> 6)
=========================================
1111 1100 0000 0000 0000 0011 1111 1111 (65535 rot 26)
:これらの結果をbines
問題の値はおそらく32ビットの番号(ある unsigned int _rotl(const unsigned int value, int shift)
{
//Assume 8 bits in a byte
unsigned bits_in_integer_type = sizeof(value)*8;
shift = shift % bits_in_integer_type;
if(shift == 0) return value; //rotation does nothing
unsigned high_bits = value << shift;
unsigned low_bits = value >> (bits_in_integer_type - shift);
return high_bits | low_bits;
}
から16ビットの最小値は、かもしれません理論的には64ビットであってもよい)、8ビットではない。あなたが無視してはいけないビットを無視しているので、あなたの結果は間違っています。式を書き換えて8ビットの数値を回転させる必要があります。シフト式の乗数はsizeof(値)ではなく、サイズ1になります。最初の式は、回転が0または 'value'のサイズの倍数であるときに、より多くの作業をすることを避けます。また、シフト数が「値」のビット数より大きい場合は、ビット数を法とするようにシフトを設定します。 –