Console.WriteLine(7 << 4);
Console.WriteLine(7 >> (32 - 4));
由于某种原因,第二种方法返回0而不是112.但它们都应该彼此相等,它们都应该返回112.
更新:
众所周知(x << n) == (x >> (32 - n))
。
你的想法?
答案 0 :(得分:2)
不要真正了解您希望在此处看到的内容:
7 << 4
向左移动(如乘法)7 * (2 ^ 4) = 7 * 16 = 112
另一方面
7 >> (32 - 4)
向右移动(如分区)7/(2^28)
,转换为整数值会导致0
。
问题是为什么Console.WriteLine
使整数重载达到峰值:因为您对整数值起作用,因此CLR
结果期望为int
。
所以结果 是正确的。
答案 1 :(得分:1)
(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
此处详细说明: Is there a way to perform a circular bit shift in C#?