Pregunta

La forma más eficiente de los poderes de código de dos es por desplazamiento de bits de enteros.

1 << n me da 2^n

Sin embargo, si tengo un número que es mayor que el valor máximo permitido en un int o una long, lo puedo usar para manipular eficazmente potencias de 2?

(Necesito ser capaz de realizar operaciones de suma, multiplicación, división y módulo del número)

¿Fue útil?

Solución

¿Es esto lo que necesita?

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

Este es el resultado cuando n = 1,000,

10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376

Otros consejos

¿Qué operaciones qué necesita para llevar a cabo en sus "poderes de dos"? Si es sólo la división y multiplicación, por ejemplo, sólo puede mantener el log2 de las potencias de dos en cuestión, y el uso de sustracción y adición de ellos en su lugar. Sin saber lo que tipo de "manipular" que desea, es imposible dar buenas sugerencias sobre la forma de eficiente "manipular"; -)

.

Fácil: long: -)

Si no le importa en coma flotante, double puede representar con exactitud todas las potencias de 2 hasta 2 ^ 1023.

De lo contrario, depende de qué tipo de "manipulación" que está haciendo.

Las apariencias como java.math.BigInteger es lo que necesita.

Tiene mod, shiftLeft, shiftRight, y de add supuesto, multiply, subtract y divide. Se trata de un tipo inmutable (ala String), por lo que quizá no es la última forma más eficiente de hacer las cosas, pero a menos que haya demostrablemente lo identificó como un problema de rendimiento, yo no me preocuparía por eso.

¿Tiene que ser precisa?

En caso contrario puede representar es como una larga multiplicada por un dos a la potencia de un int.

Ejemplo:

x = 15 * 2 ^ 123

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top