繁体   English   中英

什么(int&Integer.MAX_VALUE)%int在Java中做什么?

[英]What does (int & Integer.MAX_VALUE) % int do in Java?

在Java中,我遇到了以下行:

e.g.: (1 & Integer.MAX_VALUE) % 4
e.g.: (2 & Integer.MAX_VALUE) % 5

它有什么作用? 我已经尝试过代码,但我无法理解它的用途或功能。 试图检查的代码是什么?

基本上,它是(int & Integer.MAX_VALUE) % int

实际代码(来自Hadoop培训课程):

public int getPartition(StringPairWritable key, Text value, int numReduceTasks) {
    return (key.getLeft().hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}

i & Integer.MAX_VALUE与此代码的作用相同:

if(i < 0) {
    i = (i + Integer.MAX_VALUE + 1);
}

%是常规余数运算。

如果您不关心它的实际值(例如,如果您想将可以是正数和负数的随机数转换为正值),这是确保整数为正的快速方法。

Integer.MAX_VALUE0x7FFFFFFF 因此num & Integer.MAX_VALUE清除最高位num % numReduceTasks是除以numReduceTasks后的正常余数。

这样做是为了将有符号数转换为非负数,然后获得从0numReduceTasks-1的均匀分布值。 请注意,如果您编写Math.abs(key.getLeft().hashCode()) % numReduceTasks ,如果hashCode()恰好是Integer.MIN_VALUE ,则可能会得到负数,因为Math.abs(Integer.MIN_VALUE)仍然是Integer.MIN_VALUE 所以& Integer.MAX_VALUE是一个更安全的选择。

这里有两个部分:

  • 从Java的角度来看,函数实际上了什么,以及
  • 什么目的,功能其实供应 ,从Hadoop的角度。

让我们首先介绍它的Java方面。 它是相当简单的逐位数学运算,因为它清除符号位并将值转换为正整数。

这很容易在这里展示; 我们假设我们的密钥是-128876912,即0xF8517E90 int的最大值是0x7FFFFFFF

如果我们查看实际的数学运算,符号位将被清除(在这种情况下还有很多其他位),我们得到一个正整数值。

1111 1000 0101 0001 0111 1110 1001 0000
0111 1111 1111 1111 1111 1111 1111 1111
---------------------------------------
0111 1000 0101 0001 0111 1110 1001 0000

如果值为正,则最终结果是我们返回相同的值。

这很重要,因为哈希码可能会返回负数; 我不相信你想要一个负值,因为一个重要的原因稍后。

对于分区位,这比我真正声称的Hadoop知识要多一些,但在阅读完文档后 ,它会通知您该值属于哪个分区。 这就是模数的来源; 你可以保证在[0, partition)之间得到一个值,从而指定哪个reducer处理特定的数据位。

从我的阅读中,这是默认提供的分区程序之一,可能不完全适合您的使用(例如,您可能希望以不同的方式数据进行分组 )。

如果代码中的表达式确实存在

(i & Integer.MAX_VALUE) % j

它计算i mod j的残差类。 注意, i % j是除法的余数,对称(wrt i == 0)函数,而残差类是周期函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM