2013-09-27 34 views
9

我發現此代碼找到SO後在這裏發現重複。 但我不明白這是什麼行表示int mid = (low + high) >>> 1;「>>>」在java中意味着什麼?

private static int findDuplicate(int[] array) { 
     int low = 0; 
     int high = array.length - 1; 

     while (low <= high) { 
      int mid = (low + high) >>> 1; 
      System.out.println(mid); 
      int midVal = array[mid]; 

      if (midVal == mid) 
       low = mid + 1; 
      else 
       high = mid - 1; 
     } 
     return high; 
    } 
+2

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html – iamnotmaynard

回答

33

>>>運算符是unsigned right bit-shift operator in Java。它有效地將操作數除以2以得到右操作數的權力,或者在這裏只是2

>>>>>之間的差異只會在轉換負數時出現。 >>運算符將1位移入最高有效位,如果它是1,並且>>>將移位0,無論如何。

UPDATE:

讓我們平均12147483647Integer.MAX_VALUE)。我們可以做很容易的數學:

(1 + 2147483647)/2 = 2147483648/2 = 1073741824 

現在,隨着代碼(low + high)/2,這些都是涉及到的位:

  1: 00000000 00000000 00000000 00000001 
+2147483647: 01111111 11111111 11111111 11111111 
================================================ 
-2147483648: 10000000 00000000 00000000 00000000 // Overflow 
/2 
================================================ 
-1073741824: 11000000 00000000 00000000 00000000 // Signed divide, same as >> 1. 

讓我們把 「轉移」 到>>>

  1: 00000000 00000000 00000000 00000001 
+2147483647: 01111111 11111111 11111111 11111111 
================================================ 
-2147483648: 10000000 00000000 00000000 00000000 // Overflow 
>>> 1 
================================================ 
+1073741824: 01000000 00000000 00000000 00000000 // Unsigned shift right. 
+1

@你可以用一個例子來說明。這將是非常有益的 – eagertoLearn

+1

感謝您的傑出插圖。但在這種情況下(低+高)/ 2'和低+高>>> 1,它們是如何相等的? – eagertoLearn

+1

在Java中,它們在溢出情況下不等價,正如我已經說明的那樣。 – rgettman

17

int mid = (low + high) >>> 1; 

是;通過使用無符號移位,它避免了導致負數的溢出。由於Java不支持unsigned int值,因此這是必需的。 (順便說一句char是無符號)

寫這

int mid = (low + high)/2; // don't do this 

然而,這可能溢出較大數額的傳統方法,你會得到中期負數。

例如

int high = 2100000000; 
int low = 2000000000; 
System.out.println("mid using >>> 1 = " + ((low + high) >>> 1)); 
System.out.println("mid using/2 = " + ((low + high)/2)); 

打印

mid using >>> 1 = 2050000000 
mid using/2 = -97483648 

清楚第二結果是不正確。

+1

+1;非常注意(並適當)指出char的無符號性。 – Bathsheba

+0

@peter:如果我正在執行二分搜索,那麼我需要'(mid = low + high)/ 2',那怎麼可以避免呢? – eagertoLearn

+0

@peter:您可以舉一個例子來說明'>>>'的重要性,請 – eagertoLearn

0

它是一個按位運算符。它適用於位值。 假設如果A保持60,則A >>> 2將給出15(位值0000 1111)

它的實際名稱是「Shift Zero right Operator」 這裏左操作數值右移了指定的位數(在這種情況下爲2)由右操作數填充,移位後的值用零填充(0000)。

相關問題