我在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)
来获得无符号比较,但这并不适用于长整数。