【问题标题】:Bitwise AND in Java Hashtable hash lookups?Java Hashtable哈希查找中的按位与?
【发布时间】:2013-01-03 21:36:18
【问题描述】:

我注意到hash function code 作为java.util.Hashtable#get(K key) 的一部分执行以下操作:int index = (hash & 0x7FFFFFFF) % tab.length;。这个二进制“与”操作是否仅用于重置符号位?从而避免负面的表访问。

更新:他们使用 0x7FFFFFFF 而不是 0xEFFFFFFF 的事实让我感到困惑。为什么符号需要一个完整的字节而不是一个位?

【问题讨论】:

  • 索引必须是正数,通过清除最高位可以确定该值是正数。并且在%之后会是积极的。
  • 你的更新让我很困惑。 0xE 和 0x7 都有一个未设置的位。唯一的区别是哪个位未设置:E 是 1110(因此第四个最高有效位未设置),而 7 是 0111(因此最高有效位未设置)。符号位是最高有效位。

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


【解决方案1】:

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

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

编辑: 鉴于您关于为什么 0x7FFFFFF0xEFFFFFF 的新问题 - 这些数字中的第一个全为 1,最高位设置为 0。其中第二个没有这个财产;它出现在1110 后面是很多 1。因此,用第一个屏蔽会清除 1 位,而用第二个屏蔽可能不会这样做。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

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

    0x7FFFFFFF 只是最高位。在二进制中,它是 01111111111111111111111111111111。而 0xEFFFFFFF 是 11101111111111111111111111111111,所以它会屏蔽不同的位。

    【讨论】:

      猜你喜欢
      • 2018-06-14
      • 2020-09-02
      • 2017-05-02
      • 2018-05-30
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 2012-03-20
      • 1970-01-01
      相关资源
      最近更新 更多