2012-10-27 37 views
0
Console.WriteLine(7 << 4); 
Console.WriteLine(7 >> (32 - 4)); 

出于某种原因,第二个方法返回0,而不是112,但他们都应该是彼此相等的,它们都应该返回112移位偏移返回一个错误的结果

UPDATE: 这是已知(x << n) == (x >> (32 - n))

您的想法?

+1

你从哪里得到的想法,这些都是循环? – Mat

+0

在书中(.....) –

+1

http://msdn.microsoft.com/en-us/library/aa691377(v=vs.71).aspx文档。 – Mat

回答

2

不要真的理解你希望在这里看到:

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

在另一方面

7 >> (32 - 4)被右移(如分公司) 7/(2^28),转换为整数值导致0

的问题是,为什么Console.WriteLine峰整数超载:是因为你通过CLR结果是int作用于整数值所以预期

所以结果正确。

+0

看我的更新 –

+1

一个'>>'_是不是一个分部,它是一个转变。只有没有骑自行车的情况下,其结果与部门相同。 –

+0

是正确的,我认为这是*不*关于骑自行车,但看编辑答案看到它。编辑。 – Tigran

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