簡體   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