2
uint number = 0x418  in bits : 0000010000011000
uint number1 = 0x8041 in bits: 1000000001000001
uint number2 = 0x1804 in bits: 0001100000000100

で 0x8041 を取得できません

   number >> 4;

また

   (number >> 4) & 0xffff;

シフトで 0x418 から 0x8041 と 0x1804 を取得するにはどうすればよいですか?

解決

(number >> nbits) | (number << (16 - nbits))
4

2 に答える 2

4

C# にはビット単位の回転演算子がありません。右端を超えてシフトされたビットは、落ちて消えます。これを解決するためにできることは、

(number >> nbits) | (number << (32 - nbits))

これは、32 ビットの符号なし整数をビット単位で右回転しnbitsます。

于 2013-02-25T03:18:29.180 に答える
2

あなたが説明していることは、通常、シフトではなく回転として知られています。アセンブリ (x86) では、これは ROR および ROL 命令によって公開されます。

これを行うために C# で使用できるビット単位の演算子については知りませんが、アルゴリズムは十分に単純です。

value = value & 0x1 ? (1 << Marshal.SizeOf(value) * 8 - 1) | (value >> 1) : ( value >> 1);
于 2013-02-25T03:31:08.150 に答える