2011-03-31 32 views
11

Estoy seguro de que esto no es tan difícil como me imagino.¿Forma fácil de calcular potencias enteras de 2 en C#?

Me gustaría utilizar algo equivalente a Math.Pow(double, double) pero dando como resultado un número entero. Me preocupan los errores de redondeo con los puntos flotantes.

Lo mejor que puedo llegar a decir:

uint myPower = 12; 
uint myPowerOfTwo = (uint)Math.Pow(2.0, (double)myPower); 

pensé en esto:

uint myPowerOfTwo = 1 << myPower; // doesn't work 

pero me sale el error de que el operador "< <" no se puede utilizar con operandos de tipo int o y uint.

¿Alguna sugerencia? Gracias como siempre.

Respuesta

27

tendrá que utilizar un entero con signo para el segundo operando (lado derecho) del operador de desplazamiento:

int myPower = 12; 
int myPowerOfTwo = 1 << myPower; 

Por supuesto que puede emitir el resultado en otro tipo numérico como uint:

uint myPowerOfTwo = (uint) (1 << myPower); 

De MSDN:

El operador izquierda-shift (< <) cambia su primer operando dejado por el número de los bits especificados por su segundo operando . El tipo del segundo operando debe ser int.

+0

OK, parece funcionar! ¿Pero por qué el mensaje de error de que el operador "<<" no se puede usar con operandos de tipo int o uint? ¿No acabo de usar un int? – John

+0

(para el OP) Y emitido como un último paso si es necesario –

+3

@John ¿está seguro de que no dice * y *? significado: la combinación? –

2

Si comete un método de extensión/estática, entonces sería más fácil de encontrar y corregir los errores más tarde y el optimizador todavía inline que:

public static uint Exp2(this uint exponent) { 
    return (uint)Math.Pow(2.0, (double)exponent); 
} 

entonces usted puede utilizar como:

uint myPowerOfTwo = myPower.Exp2(); 
Cuestiones relacionadas