我正在使用短类型变量在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然后什么都没发生?或者我应该进行手动测试?虽然代码中存在很多这种变化,但我更倾向于采用更简洁的解决方案。
问候。
答案 0 :(得分:0)
这些操作并不关心签名,如评论中所述。但我可以扩展它。
签名和未签名版本相同的操作:
他们不同的行动:
>>
和>>>
a < b
设为(a ^ 0x80000000) < (b ^ 0x80000000)
,以便从已签名更改为无签名,或无签名更改为已签名。(a & 0xffffffffL) < (b & 0xffffffffL)
进行无符号比较,但这并不能说明多头。