2009-07-23 98 views
2

A)(Int32)X | ((Int32)Y << 16);按位操作

B)(Int32)X + (Int32)Y * (Int32)Int16.MaxValue;

不應該都等同?我從測試中知道,第一個按預期工作,但由於某種原因,第二個沒有。 X和Y都是短褲(Int16),返回類型是整數(Int32)。

應該不是Y << 16 < =>Y * Int16.MaxValue

回答

6

爲了獲得所需的行爲,您需要乘以0x10000(即UInt16.MaxValue+1)。 Int16.MaxValue0x7fff

5 << 16 
327680 

5 * 0x10000 
327680 

比較十進制系統:如果你想「轉移」 5號爲500,則需要用100乘以,而不是99 :-)

2

有2個問題,你的第二個辦法:

  • Int16的簽訂,所以最大值實際上只有15位。
  • 可以用16位表示的最大值爲2^16 - 1。
1
Right-shift 16 bits = * 2^16 

但是:

Int16.MaxValue = 2^15-1 

我認爲你需要一個16位無符號最大值+ 1

+1

無符號16位最大值仍然是2^16-1。 – 2009-07-23 02:21:32

+0

更正,謝謝。 – RBarryYoung 2009-07-23 02:38:23

1

俯瞰您的MaxValue比一個也不能少兩個力量,因爲你有一個更大的問題先覆蓋:

ORSUM操作不相似。當您正在使用32位整數和16位輪班工作,會有進行+操作和逐位的OR'ing操作。

所以,這兩種方式是完全不同的。

然後,當然,MaxValue的解釋讓你的兩次'換班'嘗試不同。它應該是(x * MaxValue + x)(x * (MaxValue+1))