A)(Int32)X | ((Int32)Y << 16)
;
B)(Int32)X + (Int32)Y * (Int32)Int16.MaxValue
;
两者不应该相同吗?我从测试中知道第一个按预期工作,但由于某种原因,第二个没有。 X和Y都是short(Int16
),返回类型是整数(Int32
)。
不应Y << 16
&lt; =&gt; Y * Int16.MaxValue
?
答案 0 :(得分:6)
要获得所需的行为,您需要乘以0x10000
(即UInt16.MaxValue+1
)。 Int16.MaxValue
为0x7fff
。
5 << 16
327680
5 * 0x10000
327680
与十进制系统比较:如果你想要将数字5“移位”到500,你需要乘以100,而不是99: - )
答案 1 :(得分:2)
第二种方法存在两个问题:
答案 2 :(得分:1)
Right-shift 16 bits = * 2^16
可是:
Int16.MaxValue = 2^15-1
我认为你想要一个无符号的16位最大值+ 1
答案 3 :(得分:1)
俯视你的MaxValue是一个小于2的幂,因为你有一个更大的问题要首先覆盖:
OR 和 SUM 操作不相似。当您使用32位整数和16位移位时, +
操作和按位OR'将进位使用 OR 操作。
所以,这两种方式完全不同。
然后,当然,MaxValue解释使您的两次“转移”尝试不同。它应该是(x * MaxValue + x)
或(x * (MaxValue+1))
。