Java Hashtable哈希查找中的按位AND?

时间:2013-01-20 19:26:09

标签: java data-structures hash hashtable bit-manipulation

我注意到java.util.Hashtable#get(K key)作为int index = (hash & 0x7FFFFFFF) % tab.length;的一部分执行了以下操作:{{1}}。这是二进制'和'操作意味着只重置符号位?因此,避免负表访问。

更新:他们'和'用0x7FFFFFFF而不是0xEFFFFFFF困惑了我。为什么符号需要一个完整的字节而不是一个比特?

2 个答案:

答案 0 :(得分:5)

是的,这是对的。这是为了避免对哈希表中的底层数组进行负索引。

请注意,在使用无符号整数类型(如C或C ++)的语言中,只需在哈希函数中使用无符号值即可避免这种情况。

编辑:鉴于您对0x7FFFFFF0xEFFFFFF的原因有关的新问题 - 这些数字中的第一个是全部1,顶部位设置为0.其中第二个没有这个属性;它出现在1110后面跟着很多1。因此,使用第一个屏蔽将清除1位,而使用第二个屏蔽可能不会执行此操作。

希望这有帮助!

答案 1 :(得分:2)

  

他们'和'用0x7FFFFFFF而不是0xEFFFFFFF的事实让我感到困惑。为什么符号需要一个完整的字节而不是一个比特?

0x7FFFFFFF只是最高位。在二进制文件中它是01111111111111111111111111111111。其中0xEFFFFFFF是11101111111111111111111111111111因此它将屏蔽掉不同的位。