我一直在研究哈希表源代码。发现哈希发生的过程如下:
int index = (hash & 0x7FFFFFFF) % tab.length;
我不理解为什么要在此处使用位与运算符?
如果我们将0x7FFFFFFF转换为二进制,我们得到= 111 1111 1111 1111 1111 1111 1111 1111。
我知道按位与运算将在第一位和第二位都为1时给出 1。因此,如果我们获得一些对象哈希码,例如2314539,将其转换为二进制并执行 & 操作,我们实际上会得到相同的数字:
2314539 = 10 0011 0101 0001 0010 1011。
10 0011 0101 0001 0010 1011
&
11 1111 1111 1111 1111 1111
=
10 0011 0101 0001 0010 1011
10 0011 0101 0001 0010 1011 = 2314539(二进制转十进制)
正如您所看到的,这个操作并没有进行任何更改。那么这里的重点是什么呢?
hash
中的负数转换为正数(清除符号比特位),但不会改变其他值。 - Eran