2016-10-04 14 views
6

Po uruchomieniu następującego kodu w systemie Intellij z wprowadzeniem 1000000000000 proces przechowuje moment co 8 milionów pętli.dla pętli robi pauzę co 8 milionów iteracji - dlaczego?

Dlaczego tak jest? Dlaczego nie działa w jednym płynnym przepływie do końca?

import java.util.*; 

public class Main { 

    public static void main(String[] args) { 
     Scanner in = new Scanner(System.in); 
     System.out.println("Please type a number"); 
     long n = in.nextLong(); 
     System.out.println("Thanks."); 

     long count = 0; 
     for (long i=0; i<=n; i++) { 
      if ((n+i) == (n^i)) { 
       count++; 
       if (count % 1000000 == 0) 
       System.out.println(count); 
      } 
     } 
     System.out.println(count); 
    } 
} 
+0

Jak ustaliłeś "pauzę"? – Turing85

+0

Po prostu patrząc na stdout. Zatrzymuje się co 8 milionów iteracji. – RichArt

+0

@RichArt nie "zatrzymuje się" co 8 milionów iteracji. Wciąż trwa. Tyle tylko, że drukujesz coś co milion razy tyle, że '(n + i) == (n^i)'. –

Odpowiedz

7

Warunkiem

(n + i) == (n^i) 

wystąpią głównie gdy nie ma nakładających bitów n i i, ponieważ w tym przypadku dodawania i XOR są zasadniczo takie samo.

Na przykład, jeśli n == 4 i i == 3, następnie w binarnym n == 100 i i == 011, więc

n + i == 100 + 011 == 111 == 7 
n^i == 100^011 == 111 == 7 

nie jestem przekonany, że nie istnieją żadne numery z bitów wspólnych dla których warunek jest spełniony również; ale są to "oczywiste" przypadki, dla których jest to prawdą.

binarny forma 1000000000000 jest

1110100011010100101001010001000000000000 

Najmniej znaczący bit set tutaj jest 12 bit (począwszy od zerowego po prawej stronie).

12 moc 2 wynosi 4096. Tak więc wszystkie liczby mniejsze niż 4096 nie mają wspólnych bitów z n, więc policzymy wszystkie liczby 0-4095. Od tego momentu będziesz liczyć tylko te liczby, które nie mają zestawu 12 bitów. Tak więc szybkość zliczania liczb zwolni.

Następnie trafisz na 16. LSB. Teraz będziesz liczył tylko liczby bez zestawu 12 i 16 bitów. Tak więc tempo liczenia liczb spowolni nieco więcej.

itp itd

Jedynym powodem, dla tych „przerw” jest zewnętrzna dla pętli naiwnie iteruje wszystkich numerach do n: nie po prostu przejść do następnego numeru, dla których warunek jest spełniony.

+0

I widać, że tak jest rzeczywiście, uruchamiając program z wprowadzeniem, powiedzmy, 1048576, który wynosi 1 << 20 i dlatego ma wszystkie niższe bity zero. – 5gon12eder

+0

@Andy: napisałeś: "Nie jestem przekonany, że nie ma liczb z wspólnymi bitami, których warunek również obowiązuje". Czy możesz zrobić przykład? Nie mogę zrozumieć o co ci chodzi. – RichArt

+0

@RichArt gdybym mógł podać przykład, byłbym przekonany, że taki przykład istniał! Może nie być; Po prostu nie chcę tego twierdzić, ponieważ nie jestem skłonny tego udowodnić. –