为什么在这里使用按位AND?

jsh*_*hen 13 java partitioning bitwise-operators

我正在阅读hadoop代码,并在分区器中找到了这一行.

(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks

他们为什么使用按位AND?

The*_*ter 18

删除符号位.在hashCode是负数的情况下.就像是Math.abs(key.hashCode())

  • `Math.abs()`有一个奇怪的习惯,即在`Integer.MIN_VALUE`(即同一个值)上返回一个负值,因为它不受`-`运算符的影响.因此,问题中的变体实际上更安全,除了可能更快一些,因为没有条件要被评估. (7认同)
  • 他们实际上并没有做"Math.abs",因为有两个补码 - 他们只想要任何正数(同时或多或少地尊重散列函数的概率分布). (3认同)