C ++允许您将两个整数比较合二为一,以进行范围检查,例如
(unsigned)X < (unsigned)Upper
在
时返回true0 <= X < Upper
Java语言没有无符号类型。您是否看到了一种获得相同效果的方法,使用单一比较而不是太多开销?
更新:
根据@Bathsheba的评论,char类型是无符号的16位,适合我的目的,因为我的整数实际上是在短路范围内。
对于int
s,问题仍然存在。
可能是(X | (Upper - 1 - X)) >= 0
行中的某些内容,它允许30位的范围。
答案 0 :(得分:4)
如果您希望Java中的数据类型能够保存无符号32位int可以容纳的值范围,那么您需要long
。您可以使用32位一位进行位掩码,以将可能为负的signed int转换为肯定为正long
的值。
(x & 0xffffffffL) < upper
// ^
// Implicit conversion to long (of both arguments)
当然是64位&#34;和&#34;并且64位比较将花费一些额外的时间,但可能比管道线断裂少。