0
Console.WriteLine(7 << 4);
Console.WriteLine(7 >> (32 - 4));

出于某种原因,第二种方法返回 0 而不是 112。但是它们都应该彼此相等,它们都应该返回 112。

更新:众所周知(x << n) == (x >> (32 - n))

你的想法?

4

2 回答 2

2

不太明白您希望在这里看到什么:

7 << 4向左移动(如乘法)7 * (2 ^ 4) = 7 * 16 = 112

在另一方面

7 >> (32 - 4)正在向右移动(如除法)7/(2^28),转换为整数值导致0.

问题是为什么Console.WriteLine会出现整数过载峰值:是因为您对结果所期望的整数值采取行动。CLRint

所以结果正确的。

于 2012-10-27T09:43:08.033 回答
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

这里有更详细的解释: 有没有办法在 C# 中执行循环位移?

于 2012-10-27T10:22:23.537 回答