按位运算

时间:2009-07-23 02:14:15

标签: c# c++ vb.net bit-manipulation

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

4 个答案:

答案 0 :(得分:6)

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

5 << 16
327680

5 * 0x10000
327680

与十进制系统比较:如果你想要将数字5“移位”到500,你需要乘以100,而不是99: - )

答案 1 :(得分:2)

第二种方法存在两个问题:

  • Int16已签名,因此最大值实际上只有15位。
  • 可以用16位表示的最大值是2 ^ 16 - 1。

答案 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))