2011-03-05 11 views
5

posibles duplicados:
Query about working out whether number is a power of 2
How to check if a number is a power of 2evaluar si el entero es POT (potencia de dos)

que requieren un cuerpo de la función de este prototipo:

bool isPOT(int x); 

Entonces volvería, por ejemplo, isPOT (3) = FALSE, pero isPOT (8) = TR UE

¿Cuál es el algoritmo más bonito/conciso? ¿Y cuál es el más eficiente?

PD: Me sorprende que no pueda encontrar esta pregunta en SO, así que estoy esperando que alguien detecte algún duplicado.

PPS: alguien puede crear POT, NPOT, Power-Of-Two tags?

+1

Sí, hay numerosos duplicados, por ejemplo, [Consulta sobre cómo calcular si el número es una potencia de 2] (http://stackoverflow.com/questions/666647/query-about-working-out-whether-number-is-a-power-of-2) –

+1

¿Por qué? necesitaría TAN la necesidad de etiquetas de poder de dos? – user470379

+0

Extraño que no vi una coincidencia al tipear el título, creo que tal vez porque utilicé 'dos' en lugar de '2' –

Respuesta

12
bool IsPOT(int x) 
{ 
    return (x > 0) && ((x & (x - 1)) == 0); 
} 
+1

Puede que desee reescribir esto en forma de macro, para que funcione en cualquier tipo de número entero #define ISPOW2 (x) ((x)> 0 &&! ((X) & ((x) - 1))) – datenwolf

+3

@ datenwolf: excepto que entonces obtienes todos los problemas habituales con las macros; probablemente sea mejor simplemente mantener como una función int, que manejará char, short e int, y luego harás una versión adicional si necesitas manejar algo más amplio que un int. –

6

No estoy seguro si se produjo este exacta pregunta, pero el cheque es fácil

x & (x - 1) == 0 
+3

Casi - también debe verificar x> 0, de lo contrario obtendrá un resultado incorrecto cuando 'x = 0'. –

+0

@PaulR Buen punto. –

Cuestiones relacionadas