Question

Je l'ai écrit un interprète qui me oblige à effectuer la division 32 bits d'entiers non signés. En Java, je peux le faire comme:

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

Mais je voudrais éviter la conversion à long et retour int. Java donne déjà l'opérateur de décalage droit non signé >>> pour ce cas particulier, alors peut-être il y a une façon intelligente de faire la division non signée de la même manière.

Notez que addition et de multiplication fin de travail, étant donné que deux numéros de compliment juste travailler.

Y at-il une meilleure façon en Java pour le faire?

Était-ce utile?

La solution

Eh bien, si vous passez par un bit, vous pouvez diviser les deux chiffres obtenus, puis déplacer deux fois (parce que le nombre résultant serait 4 fois plus petit). Mais cela ne fonctionne que sur un nombre pair, puisque vous perdez le moins important.

Je ne pense pas vraiment que ce serait vous faire économiser tout temps pour vérifier cette condition. (Ou vérifier les nombres plus petits, puis 2 31 )

Autres conseils

Vous pouvez toujours utilisé BigInteger, qui travaille sur des entiers de taille quelconque, mais ce serait beaucoup plus cher que la promotion de long et rejetterait comme int. Est-ce votre intention d'améliorer les performances (d'où vous voulez une solution « entier pur » pour éviter le temps de moulages) ou pour améliorer la façon lisible / compréhensible le code est (auquel cas BigInteger pourrait être plus propre)?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top