-1

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

我有一个需要异或的变量。

在 C++ 中我只会写

myunsignedshort = myunsignedshort ^ 0x2000;

0x2000 (hex) = 0010000000000000 (binary)

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

mysignedshort = mysignedshort ^ 0xA000;

0xA000 (hex) = 1010000000000000 (binary)

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

问候。

编辑:好的,你们是对的,那一点没有引起问题。

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

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

mysignedshort = mysignedshort << 1;

任何想法如何避免这个新问题,以便如果它转移到 MSB 则什么都不会发生?还是我应该做一个手动测试?虽然代码中有很多这种变化,所以我更喜欢更简洁的解决方案。

问候。

4

1 回答 1

0

如评论中所述,这些操作不关心签名。但我可以对此进行扩展。

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

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

它们不同的操作:

  • 除法/余数
  • 右移,有>>>>>
  • 排序比较,您可以将a < bas(a ^ 0x80000000) < (b ^ 0x80000000)从有符号更改为无符号,或将无符号更改为有符号。
    您也可以使用(a & 0xffffffffL) < (b & 0xffffffffL)来获得无符号比较,但这并不适用于 long。
于 2014-03-24T09:38:49.613 回答