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

How to make a hashcode(integer value) positive

int x = 10; int y = (x.hashcode() & 0xfffffff);

上面的代码怎么总是让y?谢谢!

x.hashcode() & 0xfffffff 将关闭符号位。 Math.abs 在这里没有使用,因为它 returns 如果 x.hashCode 等于 Integer.MIN_VALUE 则为负数,这将使 hashtable's 数组抛出一个 ArrayOutOfBoundException 这是不是你想要的。

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

但是对于哈希码,我们一直在处理冲突,所以它被认为是好的。

& 将执行按位与操作。这意味着它将采用第一个数字的位,在您的情况下是哈希码,第二个数字在您的情况下 0xFFFFFFF 并将比较它们。如果两个位都设置为 1,结果将是 1,否则将是 0.

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

如果您现在执行按位与,左边的 4 位将被忽略,因为 0xFFFFFFF 缺少前 4 位,因此它们用零填充,比较结果将是 0 .其余部分保持不变,因为第二个数字中始终有一个 1。第一位用于指示数字是正数还是负数,这个值会丢失。所以它设置为 0 因此整数是正数。

这里的缺点是后面的三位也丢失了。如果要保留它们,则必须将第一个数字设置为 0,将其余数字设置为 1,因此您可以使用 0x7FFFFFFF.[= 而不是 0xFFFFFFF 27=]