首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(int & Integer.MAX_VALUE) % int在Java中做什么?

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

Stack Overflow用户
提问于 2015-09-03 05:40:13
回答 4查看 1.3K关注 0票数 4

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

代码语言:javascript
复制
e.g.: (1 & Integer.MAX_VALUE) % 4
e.g.: (2 & Integer.MAX_VALUE) % 5

是干什么的呢?我尝试过该代码,但我无法理解它的目的或功能。要检查的代码是什么?

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

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

代码语言:javascript
复制
public int getPartition(StringPairWritable key, Text value, int numReduceTasks) {
    return (key.getLeft().hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-09-03 05:56:07

i & Integer.MAX_VALUE执行与以下代码相同的操作:

代码语言:javascript
复制
if(i < 0) {
    i = (i + Integer.MAX_VALUE + 1);
}

%是一个常规的余数操作。

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

票数 7
EN

Stack Overflow用户

发布于 2015-09-03 05:49:26

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是一种更安全的选择。

票数 4
EN

Stack Overflow用户

发布于 2015-09-03 06:28:00

这里有两部分:

  • 从Java的角度来看,这个函数实际上是做什么的,
  • 从Hadoop的角度来看,这个函数的实际用途是什么。

让我们先介绍一下Java方面的内容。这是非常简单的按位计算,因为它清除符号位并将值转换为正整数。

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

如果我们查看实际的数学操作,符号位将被清除(在本例中还有相当多的其他位),并得到一个正整数值。

代码语言:javascript
复制
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知识,但是在读文档‘之后,从而指定了处理特定数据位的哪一个缩减器。

根据我对它的阅读,这是默认提供的分词之一,可能并不完全适合您的使用(例如,您可能希望使用以不同的方式将数据分组 )。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32367741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档