2013-01-22 10 views
12

guardo la SNMPBEECodec che può essere visto in questo location
In particolare guardo la funzione encodeLength()
Un frammento Sono interessatoPerché Math.floor() usato al posto di divisione intera in BER Codec

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

(dal Drexel SNMP library).

Mi piacerebbe sapere perché viene utilizzato Math.floor() invece di una semplice divisione intera come temp/256. Sembra che la semplice divisione intera darebbe lo stesso risultato. O c'è una differenza tecnica?

+4

@EJP: No, in generale ci può essere una buona ragione tecnica per tale codice. Capire questo motivo può essere molto interessante. Tuttavia, questo non è un caso. Tuttavia, lo scopri solo chiedendo se non conosci te stesso. – sleske

+3

Non sono strettamente equivalenti: http://stackoverflow.com/questions/10457208/java-how-do-i-perform-integer-division-that-rounds-towards-infinity-rather-tha Tuttavia poiché temp è> 0 nel tuo esempio è equivalente. – assylias

+0

La ragione per cui l'ho chiesto è perché la libreria Drexel è molto popolare per SNMP. Volevo sapere se c'era qualcosa di ovvio che mi stavo perdendo. Sembra non essere – jogabonito

risposta

17

Per rispondere alla parte tecnica della tua domanda:

Utilizzando math.floor() è superfluo: temp/256 è un numero intero (dalle regole di Java per l'aritmetica intero), e utilizzando Math.floor() su un intero è inutile. Potresti semplicemente usare temp/256.

Perché l'autore ha fatto questo è impossibile rispondere senza leggere la loro mente. L'autore potrebbe semplicemente essere stato confuso circa il comportamento della divisione in Java, e ha deciso di "giocare sul sicuro" - ma questa è solo una speculazione.

17

Beh, sfortunatamente l'autore non può più leggergli la sua mente - sono passati circa 12 anni da quando ho scritto questo, quindi ho dimenticato la ragione per cui non ho usato solo la divisione di interi. Alcuni pensieri: uso la divisione di interi altrove, assumendo il solito comportamento, quindi non sarebbe stata probabilmente una confusione di base sulle regole per la divisione intera in Java; è possibile (anche se improbabile) che a un certo punto io stia usando un tipo di dati non integrale per l'argomento e non mi sia liberato del pavimento superfluo() quando sono cambiato; o forse (più probabilmente) a un certo punto stavo tentando di arrotondare piuttosto che giù mentre sviluppavo l'algoritmo, usando ceil() come un modo economico (= meno caratteri) per farlo, e solo riflessivamente passato a floor() quando io cambiato.

Quindi purtroppo la vera ragione si perde nella notte dei tempi ... ma sono d'accordo, il pavimento() è superfluo. Dovrei davvero pubblicare il codice su Github o simili in modo che la gente possa migliorarla ed evolverla. \ Jon

Problemi correlati