位操作-在Java中简单的按位操作



我在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然后什么都没有发生?还是我应该做一个手工测试?代码中有很多这样的变化,所以我更喜欢一个更简洁的解决方案。

问候。

这些操作不关心签名,正如评论中提到的那样。但是我可以扩展一下

有符号和无符号版本相同的操作:

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

不同的操作:

  • 部门/剩余
  • 右移,有>>>>>
  • 有序比较,可以将a < b作为(a ^ 0x80000000) < (b ^ 0x80000000)从有符号变为无符号,或者将无符号变为有符号。
    您也可以使用(a & 0xffffffffL) < (b & 0xffffffffL)来获得无符号比较,但这并不适用于长整数。

最新更新