如何使哈希码(整数值)为正
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
.
举个简短的例子:如果我们在 1011
和 1100
之间进行比较,结果将是 1000
因为只有左边的位是 1
两个数字。回到 0xFFFFFFF
,这个数字的二进制表示仅由 28 位组成。像哈希函数返回的整数一样由 32 位组成。
如果您现在执行按位与,左边的 4 位将被忽略,因为 0xFFFFFFF
缺少前 4 位,因此它们用零填充,比较结果将是 0
.其余部分保持不变,因为第二个数字中始终有一个 1。第一位用于指示数字是正数还是负数,这个值会丢失。所以它设置为 0
因此整数是正数。
这里的缺点是后面的三位也丢失了。如果要保留它们,则必须将第一个数字设置为 0
,将其余数字设置为 1
,因此您可以使用 0x7FFFFFFF
.[= 而不是 0xFFFFFFF
27=]
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
.
举个简短的例子:如果我们在 1011
和 1100
之间进行比较,结果将是 1000
因为只有左边的位是 1
两个数字。回到 0xFFFFFFF
,这个数字的二进制表示仅由 28 位组成。像哈希函数返回的整数一样由 32 位组成。
如果您现在执行按位与,左边的 4 位将被忽略,因为 0xFFFFFFF
缺少前 4 位,因此它们用零填充,比较结果将是 0
.其余部分保持不变,因为第二个数字中始终有一个 1。第一位用于指示数字是正数还是负数,这个值会丢失。所以它设置为 0
因此整数是正数。
这里的缺点是后面的三位也丢失了。如果要保留它们,则必须将第一个数字设置为 0
,将其余数字设置为 1
,因此您可以使用 0x7FFFFFFF
.[= 而不是 0xFFFFFFF
27=]