Java中的简单按位操作

时间:2014-03-24 01:05:58

标签: java bit-manipulation bitwise-operators bitwise-xor

我正在使用短类型变量在Java中编写代码。短变量通常是16位,但遗憾的是Java没有无符号原语类型,所以我使用15位低位而不是忽略符号位。请不要建议对此部分进行更改,因为我已经在这个实现中已经很远......这是我的问题:

我有一个变量需要XOR。

在C ++中我会写

myunsignedshort = myunsignedshort ^ 0x2000;

0x2000 (hex) = 0010000000000000 (binary)

然而,在Java中,我还必须处理符号位,所以我试图更改我的掩码,以便它不会影响xor ......

mysignedshort = mysignedshort ^ 0xA000;

0xA000 (hex) = 1010000000000000 (binary)

这没有达到预期的效果,我不知道为什么。任何人都可以看到我哪里出错了?

问候。

编辑:好吧,你们是对的,这一点并没有引起这个问题。

当我向左移位时,问题出现了。

我不小心将位移到符号位。

mysignedshort = mysignedshort<< 1;

任何想法如何避免这个新的概率,以便如果它转移到MSB然后什么都没发生?或者我应该进行手动测试?虽然代码中存在很多这种变化,但我更倾向于采用更简洁的解决方案。

问候。

1 个答案:

答案 0 :(得分:0)

这些操作并不关心签名,如评论中所述。但我可以扩展它。

签名和未签名版本相同的操作:

  • 加/减
  • 和/或/ XOR
  • 乘法
  • 左移
  • 平等测试

他们不同的行动:

  • 除法/余数
  • 右移,有>>>>>
  • 有序比较,您可以将a < b设为(a ^ 0x80000000) < (b ^ 0x80000000),以便从已签名更改为无签名,或无签名更改为已签名。
    您也可以使用(a & 0xffffffffL) < (b & 0xffffffffL)进行无符号比较,但这并不能说明多头。