Console.WriteLine(7 << 4);
Console.WriteLine(7 >> (32 - 4));
出于某种原因,第二个方法返回0,而不是112,但他们都应该是彼此相等的,它们都应该返回112移位偏移返回一个错误的结果
UPDATE: 这是已知(x << n) == (x >> (32 - n))
。
您的想法?
Console.WriteLine(7 << 4);
Console.WriteLine(7 >> (32 - 4));
出于某种原因,第二个方法返回0,而不是112,但他们都应该是彼此相等的,它们都应该返回112移位偏移返回一个错误的结果
UPDATE: 这是已知(x << n) == (x >> (32 - n))
。
您的想法?
不要真的理解你希望在这里看到:
7 << 4
被左移(如乘法)7 * (2^4) = 7 * 16 = 112
在另一方面
7 >> (32 - 4)
被右移(如分公司) 7/(2^28)
,转换为整数值导致0
。
的问题是,为什么Console.WriteLine
峰整数超载:是因为你通过CLR
结果是int
作用于整数值所以预期。
所以结果是正确。
看我的更新 –
一个'>>'_是不是一个分部,它是一个转变。只有没有骑自行车的情况下,其结果与部门相同。 –
是正确的,我认为这是*不*关于骑自行车,但看编辑答案看到它。编辑。 – Tigran
(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#?
你从哪里得到的想法,这些都是循环? – Mat
在书中(.....) –
http://msdn.microsoft.com/en-us/library/aa691377(v=vs.71).aspx文档。 – Mat