A)(Int32)X | ((Int32)Y << 16)
;按位操作
B)(Int32)X + (Int32)Y * (Int32)Int16.MaxValue
;
不應該都等同?我從測試中知道,第一個按預期工作,但由於某種原因,第二個沒有。 X和Y都是短褲(Int16
),返回類型是整數(Int32
)。
應該不是Y << 16
< =>Y * Int16.MaxValue
?
A)(Int32)X | ((Int32)Y << 16)
;按位操作
B)(Int32)X + (Int32)Y * (Int32)Int16.MaxValue
;
不應該都等同?我從測試中知道,第一個按預期工作,但由於某種原因,第二個沒有。 X和Y都是短褲(Int16
),返回類型是整數(Int32
)。
應該不是Y << 16
< =>Y * Int16.MaxValue
?
爲了獲得所需的行爲,您需要乘以0x10000
(即UInt16.MaxValue+1
)。 Int16.MaxValue
是0x7fff
。
5 << 16
327680
5 * 0x10000
327680
比較十進制系統:如果你想「轉移」 5號爲500,則需要用100乘以,而不是99 :-)
有2個問題,你的第二個辦法:
Right-shift 16 bits = * 2^16
但是:
Int16.MaxValue = 2^15-1
我認爲你需要一個16位無符號最大值+ 1
俯瞰您的MaxValue比一個也不能少兩個力量,因爲你有一個更大的問題先覆蓋:
的OR和SUM操作不相似。當您正在使用32位整數和16位輪班工作,會有進行與+
操作和逐位的OR'ing與或操作。
所以,這兩種方式是完全不同的。
然後,當然,MaxValue的解釋讓你的兩次'換班'嘗試不同。它應該是(x * MaxValue + x)
或(x * (MaxValue+1))
。
無符號16位最大值仍然是2^16-1。 – 2009-07-23 02:21:32
更正,謝謝。 – RBarryYoung 2009-07-23 02:38:23