【问题标题】:Why is variable index ANDed twice with 0x1f?为什么变量索引与 0x1f 进行两次 AND 运算?
【发布时间】:2016-09-25 08:35:13
【问题描述】:

我正在阅读有关 Scala 中不可变集合的底层数据结构(更准确地说是HashMapVector),在阅读代码时,我遇到了 HashTrieMap 中的 get0 函数。

为什么变量 index0x1f 再次在第 312 行进行 AND 运算?在我看来,结果是相同的(即第二个 AND 不是必需的)。我错过了什么?

这里是前面提到的函数:

override def get0(key: A, hash: Int, level: Int): Option[B] = {
  val index = (hash >>> level) & 0x1f // index is AND-ed with 0x1f
  val mask = (1 << index)
  if (bitmap == - 1) {
    elems(index & 0x1f).get0(key, hash, level + 5) // once again, AND-ed with 0x1f
  } else if ((bitmap & mask) != 0) {
    val offset = Integer.bitCount(bitmap & (mask-1))
    elems(offset).get0(key, hash, level + 5)
  } else
    None
}

【问题讨论】:

    标签: java scala hashmap immutability trie


    【解决方案1】:

    你没有错过任何东西。事实上,第二个 AND 是不必要的。

    【讨论】:

    • 因为人不完美?也许提交 PR 以将其删除。
    • @ChrisMartin Sure :) 但是很自然地认为编写该代码的人非常出色(他们确实如此),并且有一个模糊而更深层次的原因为什么必须这样做 正是这样。我无意对此迂腐。
    • 如果有一个微妙的原因,至少不加注释肯定是一个错误。
    • @ale64bit 人可以很好,但仍然会犯错;-)
    猜你喜欢
    • 2011-01-21
    • 2020-12-14
    • 2020-12-12
    • 2022-01-11
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    相关资源
    最近更新 更多