2011-05-04 64 views
4

我低估了>>運算符的複雜度;它沒有做我認爲會的事。意外的C#移位結果

我想右移6542454.一個uint值我想它的工作是這樣的:

val (is) == 11000111101010001110110
val >> 1 == 1100011110101000111011
val >> 2 == 110001111010100011101
val >> 3 == 11000111101010001110
val >> 4 == 1100011110101000111
val >> 5 == 110001111010100011
val >> 6 == 11000111101010001
val >> 7 == 1100011110101000

在現實中,結果是:

val >> 1 == 1100011110101000111011
val >> 2 == 110001111010100011101
val >> 3 == 11111001100100110010011
val >> 4 == 1111100110010011001001
val >> 5 == 111110011001001100100
val >> 6 == 11111001100100110010
val >> 7 == 10011011111110111111100

第三操作顯然做了一些我不明白的事情,事情就從那裏消失了。似乎在第7次手術中做了我不明白的事情。

連續使用>>=操作7次得到的值我希望:

val >>= 1 == 1100011110101000111011
val >>= 1 == 110001111010100011101
val >>= 1 == 11000111101010001110
val >>= 1 == 1100011110101000111
val >>= 1 == 110001111010100011
val >>= 1 == 11000111101010001
val >>= 1 == 1100011110101000

爲什麼val >> 3與3個電話val >>= 1不一樣?

UPDATE:

我對using a decimal to binary converter on the web that was truncating my decimal input to 7 digits故障。當從Visual Studio複製粘貼十進制值時,我沒有注意到截斷髮生。

正在移位的實際值是6542454 並且隨着每個人都正確指出,C#將這個值完美地進行位移。

+3

您能否提供一個簡單的示例程序來複制問題?您所描述的行爲違反了C#規範,因此值得檢查是否存在不同的問題,例如代碼中計算轉換的運算符優先級問題。 – 2011-05-04 18:32:30

+0

您可以顯示您用於打印出值的代碼嗎?您>> 3在Dec(8178067)中顯示的結果幾乎是正確的,而不是817806.因此,我猜您的打印代碼是關閉的...... – 2011-05-04 18:34:27

+0

請顯示您的代碼。 – 2011-05-04 18:35:27

回答

6

我寫的代碼輸出每個班次:

uint i = 6542454; 

for (int j = 0; j < 8; j++) 
{ 
    uint k = i >> j; 
    Console.WriteLine("{1} = {0}", Convert.ToString(k, 2), k); 
} 

,這就是我希望並沒有看到。

6542454 = 11000111101010001110110 
3271227 = 1100011110101000111011 
1635613 = 110001111010100011101 
817806 = 11000111101010001110 
408903 = 1100011110101000111 
204451 = 110001111010100011 
102225 = 11000111101010001 
51112 = 1100011110101000 
+0

是的,我只是做了同樣的事情,我也得到了預期的結果。 – Euphoric 2011-05-04 18:34:39