2015-10-19 27 views
2

我正在第一次使用bitshift,並且遇到了意想不到的結果。錯位結果

我聲明瞭偏移量如下:

byte p_size = 0; 
if (ver == 0x12 || ver == 0x13) 
    p_size = 20; 
else 
    p_size = 40; 

要移位的聲明爲

int t_size = rinput.ReadInt32(); 

和值最後我使用的代碼轉移:

int temp = t_size >> p_size << p_size; 

假設t_size = 0x20 00385E和p_size = 20。如預期的那樣,temp = 0x20000000。

現在如果t_size = 0x40001014且p_size = 40,則temp = 0x40001000而不是0x40000000。我使用按位計算器「手動」計算出來的,它與0x40000000的預期結果相匹配。

這可能是一個愚蠢的疏忽我的名義,但我不明白什麼會導致奇怪的結果p_size = 40 ...任何意見表示讚賞!

+3

你有什麼期待*從*移32位,40位左? –

回答

7

將32位整數移位40位並沒有什麼意義,因爲您會將整數移位比它包含的位更多。

兩者leftright移位運算符文件他們在這種情況下,這樣做:

如果第一操作數是一個整數或uint(32位量),移位 計數由低定第二操作數 (第二操作數& 0x1f)的5位。

所以當p_size是40的換檔,由40 & 0x1f = 8 bits.

轉移如果您需要40位的轉移,而是你的價值爲long

5

當前行爲被期待作爲40 & 0x1F的是8如operator >>

描述如果第一操作數是一個整數或uint(32位量),移位計數被通過低順序給出第二個操作數的第五個位(第二個操作數爲& 0x1f)。

你可能尋找一些屏蔽,而不是變革 - 也許

t_size & 0xFF000000