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

时间:2015-10-19 16:41:43

标签: java hash bitwise-operators

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

以上代码如何始终使y 正面?谢谢!

2 个答案:

答案 0 :(得分:10)

x.hashcode() & 0xfffffff会关闭标志位。此处未使用Math.abs,因为如果x.hashCode等于Integer.MIN_VALUE,它会返回负数,这会使hashtable's数组抛出一个ArrayOutOfBoundException而不是有趣。< / p>

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

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

答案 1 :(得分:3)

jl将执行按位与比较。这意味着它将使用第一个数字(在您的情况下为哈希码)和第二个数字(在您的情况下为id || name || age 1 || A || 22 2 || B || 32 3 || C || 29 4 || D || 24 )中的位,并将它们进行比较。如果两个比较位都设置为&,则结果将为1,否则将为0xFFFFFFF

举一个简短的例子:如果我们在10之间进行比较,结果将是1011,因为两个数字的左位均为1100 。回到1000,此数字的二进制表示形式仅由28位组成。像散列函数返回的整数一样,由32位组成。

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

这里的缺点是以下三位也丢失了。如果要保留它们,则必须将第一个数字设置为0,将其余数字设置为0,因此,您可以使用0来代替1