C++ 允许您将两个整数比较合并为一个以进行范围检查,例如
(unsigned)X < (unsigned)Upper
什么时候返回真
0 <= X < Upper
Java 语言没有无符号类型。您是否找到了一种方法来获得相同的效果,使用一次比较并且没有太多开销?
更新:
根据@Bathsheba 的评论,char 类型是无符号的 16 位,适合我的目的,因为我的整数实际上在短整型范围内。
对于普通的 int
问题仍然悬而未决。
可能是 (X | (Upper - 1 - X)) >= 0
行中的内容,允许 30 位的范围。
最佳答案
如果您希望 Java 中的数据类型能够容纳 unsigned 32 位 int 可以容纳的值范围,那么您需要 long
。您可以使用 32 个一位进行位掩码,将可能为负的带符号整数转换为肯定为正的 long
值。
(x & 0xffffffffL) < upper
// ^
// Implicit conversion to long (of both arguments)
当然,64 位“与”和 64 位比较会花费一些额外的时间,但可能少于管道中断。
关于java - Java中的双重比较技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39972446/