我注意到java.util.Hashtable#get(K key)
作为int index = (hash & 0x7FFFFFFF) % tab.length;
的一部分执行了以下操作:{{1}}。这是二进制'和'操作意味着只重置符号位?因此,避免负表访问。
更新:他们'和'用0x7FFFFFFF而不是0xEFFFFFFF困惑了我。为什么符号需要一个完整的字节而不是一个比特?
答案 0 :(得分:5)
是的,这是对的。这是为了避免对哈希表中的底层数组进行负索引。
请注意,在使用无符号整数类型(如C或C ++)的语言中,只需在哈希函数中使用无符号值即可避免这种情况。
编辑:鉴于您对0x7FFFFFF
与0xEFFFFFF
的原因有关的新问题 - 这些数字中的第一个是全部1,顶部位设置为0.其中第二个没有这个属性;它出现在1110
后面跟着很多1。因此,使用第一个屏蔽将清除1位,而使用第二个屏蔽可能不会执行此操作。
希望这有帮助!
答案 1 :(得分:2)
他们'和'用0x7FFFFFFF而不是0xEFFFFFFF的事实让我感到困惑。为什么符号需要一个完整的字节而不是一个比特?
0x7FFFFFFF只是最高位。在二进制文件中它是01111111111111111111111111111111。其中0xEFFFFFFF是11101111111111111111111111111111因此它将屏蔽掉不同的位。