如何使哈希码(整数值)为正

Siv*_*a R 6 java hash bitwise-operators

int x = 10; int y = (x.hashcode() & 0xfffffff);
Run Code Online (Sandbox Code Playgroud)

以上代码如何总是y 积极的?谢谢!

Sle*_*idi 11

x.hashcode() & 0xfffffff将关闭标志位.Math.abs这里没有使用,因为它返回负数,如果x.hashCode等于Integer.MIN_VALUE将使 hashtable's数组抛出一个ArrayOutOfBoundException不好玩的东西.

来自@JonSkeet评论:它不仅关闭符号位,还清除后三位.

但是使用哈希码我们一直处理冲突,所以它被认为是好的.

  • 它不会*只是*关闭标志位,请注意 - 它也清除了接下来的三位...... (8认同)

小智 5

&会进行位和比较。这意味着它将使用第一个数字(在您的情况下为哈希码)和第二个数字(在您的情况下)的位0xFFFFFFF,并将它们进行比较。如果两个比较位都设置为1,则结果将为1,否则将为0

举一个简短的例子:如果我们在1011和之间进行比较1100,结果将是1000因为1两个数字都只剩下左一位。回到0xFFFFFFF,该数字的二进制表示形式仅由28位组成。像哈希函数返回的整数一样的整数由32位组成。

如果现在执行按位与比较,则剩余的4位将被忽略,因为0xFFFFFFF缺少前4位,因此它们填充有零,并且比较的结果为0。其余部分保持不变,因为第二个数字中总是有一个。第一位用于指示数字是正数还是负数,并且该值丢失。因此设置为0,因此整数为正。

此处的缺点是以下三个位也会丢失。如果要保留它们,则必须将第一个数字设置为0,将其余数字设置为1,而不是0xFFFFFFF使用0x7FFFFFFF