2013-01-22 15 views
12

szukam na SNMPBEECodec które można zobaczyć w tym location
W szczególności szukam w funkcji encodeLength()
fragment jestem zainteresowanyDlaczego Math.floor() używana zamiast podziału całkowitej w BER Codec

 int numBytes = 0; 
     int temp = length; 
     while (temp > 0) 
     { 
      ++numBytes; 
      temp = (int)Math.floor(temp/256); 
     } 

(od Drexel SNMP library).

Chciałbym wiedzieć, dlaczego jest używany Math.floor(), a nie tylko prosty podział na liczby całkowite, taki jak temp/256. Wydaje się, że prosty podział na liczby całkowite dałby taki sam wynik. Czy istnieje różnica techniczna?

+4

@EJP: Nie, ogólnie może istnieć dobry techniczny powód takiego kodu. Zrozumienie tego powodu może być bardzo interesujące. Jednak tak nie jest. Jednak dowiesz się tylko, pytając, czy nie znasz siebie. – sleske

+3

Nie są one ściśle równoważne: http://stackoverflow.com/questions/10457208/java-how-do-i-perform-integer-division-that-rounds-towards-infinity-rather-tha Jednak ponieważ temp jest> 0 w twoim przykładzie jest to odpowiednik. – assylias

+0

Powodem, dla którego o to poprosiłem, było to, że biblioteka Drexel jest bardzo popularna dla SNMP. Chciałem wiedzieć, czy było coś oczywistego, czego mi brakowało. Wydaje się nie być – jogabonito

Odpowiedz

17

Aby odpowiedzieć na część techniczną zapytanie:

Korzystanie math.floor() jest zbędny: temp/256 jest liczbą całkowitą (według zasad Javy dla arytmetyki liczb całkowitych), a przy użyciu Math.floor() na liczbę całkowitą jest bezcelowe. Możesz po prostu użyć temp/256.

Dlaczego autor tego nie mógł odpowiedzieć, nie czytając ich umysłu. Autor mógł po prostu być zdezorientowany co do zachowania podziału w Javie i postanowił "grać bezpiecznie" - ale to tylko spekulacja.

17

Cóż, niestety autor nie może już czytać w jego umyśle - minęło około 12 lat, odkąd to napisałem, więc zapominam o powodzie, dla którego nie używałem wyłącznie podziału na liczby całkowite. Kilka myśli: Używam podziału liczb całkowitych gdzie indziej przy założeniu zwykłego zachowania, więc prawdopodobnie nie byłby to podstawowy błąd w zasadach podziału na liczby całkowite w Javie; możliwe (choć mało prawdopodobne), że w pewnym momencie używałem nieintegralnego typu danych dla argumentu i nie pozbyłem się zbytecznej podłogi(), kiedy się zmieniłem; a może (bardziej prawdopodobne), że w pewnym momencie próbowałem zaokrąglić w górę, a nie w dół, rozwijając algorytm, używając ceil() jako taniej (= mniej znaków) sposób, aby to zrobić, i po prostu odruchowo przełączyłem się na floor(), kiedy zmienione.

Więc niestety prawdziwy powód zaginie w mgle czasu ... ale zgadzam się, że podłoga() jest zbyteczna. Naprawdę powinienem opublikować kod na Github lub tym podobne, aby ludzie mogli go ulepszać i ewoluować. \ Jon

Powiązane problemy