Java中双波纹(~~)的含义是什么?

问题:

浏览Guava的源代码时,我遇到了以下代码(内部类CartesianSet的部分hashCode的一部分)):

int adjust = size() - 1;
for (int i = 0; i < axes.size(); i++) {
    adjust *= 31;
    adjust = ~~adjust;
    // in GWT, we have to deal with integer overflow carefully
}
int hash = 1;
for (Set<E> axis : axes) {
    hash = 31 * hash + (size() / axis.size() * axis.hashCode());

    hash = ~~hash;
}
hash += adjust;
return ~~hash;

adjusthash都是int。根据我对Java的了解,~意味着逐位否定,所以adjust = ~~adjusthash = ~~hash应该使变量保持不变。运行小测试(当然启用断言),

for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) {
    assert i == ~~i;
}
&#91;/code&#93;
证实了这一点。假设番石榴人知道他们在做什么,他们必须有理由这样做。问题是什么?
 <strong>编辑</strong>正如在评论中指出的,上面的测试不包括<code>i</code>等于<code>Integer.MAX_VALUE</code>的情况。由于<code>i &lt;= Integer.MAX_VALUE</code>一直是真实的,我们需要在循环之外检查这种情况,以防止它永远循环。但是,行

assert Integer.MAX_VALUE == ~~Integer.MAX_VALUE;

产生编译器警告“比较相同的表达式”,这几乎指向它。

回答:

在Java中,这意味着什么。
但是这个评论说这条线专门用于GWT,这是一种将Java编译成JavaScript的方式。
在JavaScript中,整数类似于双精度 - 作为整数。例如,它们的最大值为2 ^ 53。但是,bitwise operators将数字视为32位,这正是您在此代码中所需要的。换句话说,~~hash在JavaScript中表示“将hash视为32位数”。具体来说,它丢弃所有底部32位(因为按位~运算符仅查看底部32位),这与Java的溢出工作方式相同。
如果没有,那么对象的哈希代码将会有所不同,这取决于它是在Java-land还是在JavaScript地(通过GWT编译)进行评估。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: What is the meaning of double tilde (~~) in Java?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

9 + 1 =