Domanda

Ho scritto un interprete che mi richiede di eseguire la divisione a 32 bit di interi senza segno. In Java, posso fare questo esempio:

reg[a] = (int) ((reg[b] & 0xFFFFFFFFL) / (reg[c] & 0xFFFFFFFFL));

Ma vorrei evitare la conversione a lungo e di nuovo a int. Java dà già il unsigned >>> giusto operatore di spostamento per questo caso speciale, quindi forse c'è un modo intelligente per fare la divisione senza segno nello stesso modo.

Si noti che aggiungere e moltiplicare il lavoro bene, dal momento che due di numeri complimento solo di lavoro.

C'è un modo migliore in Java per fare questo?

È stato utile?

Soluzione

Bene, se si sposta verso il basso di un bit, è possibile dividere le conseguenti due numeri, poi sposta su due volte (perché il numero risultante sarebbe 4 volte più piccolo). Ma questo funziona solo su numeri pari, in quanto si perderebbe il bit meno significativo.

Io in realtà non credo che si farebbe risparmiare qualsiasi momento per verificare la presenza di tale condizione. (O per numeri più piccoli poi 2 31 )

Altri suggerimenti

Si può sempre usato BigInteger, che funziona su interi arbitrari di dimensioni, ma che sarebbe molto più costoso di promuovere a long e gettato indietro come int. È la vostra intenzione di migliorare le prestazioni (e quindi si desidera una soluzione "pura intero" per evitare il tempo di calchi) o per migliorare il modo leggibile / comprensibile il codice è (nel qual caso potrebbe essere più ordinato BigInteger)?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top