2012-10-27 40 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#?