2009-10-11 7 views
5

¿Qué significa este código y qué otras maneras logran lo mismo sin usar el cambio de bit?

if ($n & ($n - 1)) 
+2

Eso es realmente un bitwise-y, no un cambio de bit. –

+1

¿Tarea? ¿entrevista? :) – DVK

+0

¿Por qué tendrías que evitar operaciones a nivel de bit esto? – MAK

Respuesta

17

Esa fórmula checks to see whether a number is a power of 2 (si su condición como está escrito es verdad, entonces el número es no una potencia de dos).

Dicho de otra manera, su prueba comprueba si hay más de un "1" bit establecido en la representación binaria de $n. Si hay cero o solo un bit establecido, entonces su prueba será falsa.

Es, de lejos, la manera más eficiente de determinar esa propiedad.

+1

Greg, la pregunta es, esencialmente, una adaptación que prueba para ver si un número no es una potencia de dos. Sin '== 0' PHP toma cualquier valor distinto de cero como verdadero. –

+0

Sí, pensé que la negación lógica sería clara. Sin embargo, he modificado mi respuesta para que sea explícita. –

+0

Bueno, no es negación a primera vista (sería '! = 0'), y mi impresión de eyze es que está en el nivel de principiante. –

5

En primer lugar, este código es PHP válido, por lo que su título es pobre.

En segundo lugar, la aritmética binaria pasando se ve algo como esto:

42 = 101010 
    & 
41 = 101001 
----------- 
40 = 101000 

como Greg establece esta es la manera más rápida para verificar si hay una potencia de 2 número, pero el código que he dado comprueba si el número es no es una potencia de 2. Esto se puede determinar fácilmente mediante la política de PHP: cualquier valor no nulo/distinto de cero es verdadero.