Console.WriteLine(7 << 4);
Console.WriteLine(7 >> (32 - 4));
出于某种原因,第二种方法返回 0 而不是 112。但是它们都应该彼此相等,它们都应该返回 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# 中执行循环位移?