![](/img/trans.png)
[英]java.lang.OutOfMemoryError - new int[Integer.MAX_VALUE];
[英]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_VALUE
是0x7FFFFFFF
。 因此num & Integer.MAX_VALUE
清除最高位num
。 % numReduceTasks
是除以numReduceTasks
后的正常余数。
这样做是为了将有符号数转换为非负数,然后获得从0
到numReduceTasks-1
的均匀分布值。 请注意,如果您编写Math.abs(key.getLeft().hashCode()) % numReduceTasks
,如果hashCode()
恰好是Integer.MIN_VALUE
,则可能会得到负数,因为Math.abs(Integer.MIN_VALUE)
仍然是Integer.MIN_VALUE
。 所以& Integer.MAX_VALUE
是一个更安全的选择。
这里有两个部分:
让我们首先介绍它的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.