移位位移返回错误的结果

时间:2012-10-27 09:39:35

标签: c# algorithm

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

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

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

你的想法?

2 个答案:

答案 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#?