符号なし整数内のビットのシフトに関する質問を受けました。私は 2 つの符号なし整数を持っていvar1
ますvar2
。の一番左のvar1
ビットを取り出して、var2
一番右の位置に移動する必要があります。したがって、var1
is12
とvar2
isの場合は0x13ac8d08
にvar2
なり0xc8d0813a
ます。C#でそれを行う方法を誰か助けてもらえますか?
ありがとう
マイケル
符号なし整数内のビットのシフトに関する質問を受けました。私は 2 つの符号なし整数を持っていvar1
ますvar2
。の一番左のvar1
ビットを取り出して、var2
一番右の位置に移動する必要があります。したがって、var1
is12
とvar2
isの場合は0x13ac8d08
にvar2
なり0xc8d0813a
ます。C#でそれを行う方法を誰か助けてもらえますか?
ありがとう
マイケル
これを試して:
var2 = (var2 << var1) | (var2 >> (32 - var1));
メソッド形式:
uint CyclicShiftLeft(uint input,int countBits)
{
return (input << countBits) | (input >> (32 - countBits))
}
編集
32
上記のコードの の意味については、コメントを参照してください。
まず、ご質問の var1 の機能がわかりません。また、シフトするビット数を指定しないか、より正確に回転させます。この例から、最上位 12 ビットを最下位の位置に移動すると仮定します。(それが var1 の目的ですか?)
unsigned int var2 = 0x13ac8d08;
unsigned int temp = (var2 >> 20) & 0xfff; // store and mask 12 bits in least significant position
var2 <<= 12; // shift left
var2 &= 0xfffff00; // mask to make sure no bits dragged from lsb by shift
var2 |= temp;
マスキングは厳密には必要ないかもしれませんが、確かに問題はありません。機械語のシフト コマンドは最上位ビットまたは最下位ビットを拡張することがありますが、それは望ましくありません。