2010-05-08 23 views
0

Le moyen le plus efficace de coder les puissances de deux est le déplacement par bits des entiers.Manière efficace de manipuler de grandes puissances de deux

1 << n me donne 2^n

Cependant, si j'ai un nombre qui est plus grande que la plus grande valeur autorisée dans un int ou long, que puis-je utiliser pour manipuler efficacement des puissances de 2?

(je dois être en mesure d'effectuer des additions, multiplication, division et opérations module sur le nombre)

+2

1 << n donne 2^n. – lhf

+0

@lhf: Oups !! – bguiz

Répondre

8

Est-ce ce que vous cherchez?

BigInteger hugeNumber = BigInteger.ONE.shiftLeft(n); 

Ceci est le résultat lorsque n = 1000,

10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376 
3

Quelles opérations avez-vous besoin d'effectuer sur vos « pouvoirs de deux »? Si c'est seulement la division et la multiplication, par exemple, vous pouvez simplement garder le log2 des puissances de deux en question, et utiliser la soustraction et l'addition à la place. Sans savoir ce que sortes de "manipuler" vous voulez, il est impossible de donner de bonnes suggestions sur la façon de efficacement "manipuler" ;-).

+0

Désolé, j'ai laissé cela hors de question, je dois effectuer l'addition, la soustraction, la multiplication, la division, et le module – bguiz

+0

@bguiz, alors vous avez besoin de BigInteger, comme d'autres réponses mentionnées. –

+1

@bguiz Si ​​vous avez besoin d'effectuer une addition, etc., vous ne travaillez pas réellement avec des puissances de deux. Vous voulez juste une bibliothèque pour travailler avec de grands nombres. Donc, je me demande pourquoi vous n'avez pas demandé cela en premier lieu. – sigfpe

1

Facile: long :-)

Si vous ne représentent pas l'esprit à virgule flottante, double peut exactement toutes les puissances de 2 jusqu'à 2^1023.

Sinon, cela dépend du type de "manipulation" que vous faites.

+0

@ dan04: Je veux éviter le point flottant, aussi «long» n'est pas assez grand. Je vais mettre à jour la question pour la rendre plus claire. – bguiz

1

On dirait java.math.BigInteger est ce que vous avez besoin.

Il a mod, shiftLeft, shiftRight, et bien sûr add, multiply, subtract et divide. C'est un type immuable (ala String), donc ce n'est peut-être pas la manière la plus efficace de faire les choses, mais à moins que vous ne l'ayez identifié comme un problème de performances, je ne m'en soucierais pas.

0

Faut-il être précis? Sinon, vous pouvez représenter est comme un long multiplié par deux à la puissance d'un int.

Exemple:

x = 15 * 2^123