Console.WriteLine(7 << 4);
Console.WriteLine(7 >> (32 - 4));
何らかの理由で、2番目のメソッドは112ではなく0を返します。ただし、両方が互いに等しくなければならず、両方とも112を返す必要があります。
更新:それは知られてい(x << n) == (x >> (32 - n))
ます。
あなたのアイデアは?
ここに何が表示されるかを本当に理解していない:
7 << 4
左にシフトしています(乗算のように)7 * (2 ^ 4) = 7 * 16 = 112
一方では
7 >> (32 - 4)
は右にシフトしています(除算のように) 。7/(2^28)
整数値に変換すると、になり0
ます。
問題は、なぜConsole.WriteLine
ピークが整数の過負荷になるのかということです。これは、整数値に作用するため、結果によって期待されるのはです。CLR
int
したがって、結果は正しいです。
(x << n) == (x >> (32 - n))
これは、実行されている循環シフトである場合にのみ当てはまりますが、C#では当てはまりません。C#では、が最初のビットを過ぎて右にシフトされると、それらのビットは失われます。
//Seven = 00000111
Console.WriteLine(7 >> 1); //00000011
Console.WriteLine(7 >> 2); //00000001
Console.WriteLine(7 >> 3); //00000000
Console.WriteLine(7 >> 4); //00000000
//.
//.
//.
Console.WriteLine(7 >> 28); //00000000
ここでより詳細に説明されています: C#で循環ビットシフトを実行する方法はありますか?