2009-10-11 9 views
5

Qu'est-ce que ce code signifie et quelles sont les autres façons d'accomplir la même chose sans utiliser le transfert de bits?

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

C'est en fait un bit-et, pas un peu de décalage. –

+1

Travail à domicile? entretien? :) – DVK

+0

Pourquoi auriez-vous besoin d'éviter les opérations au niveau du bit cela? – MAK

Répondre

17

Cette formule checks to see whether a number is a power of 2 (si votre condition écrit est vrai, alors le nombre est pas une puissance de deux). En d'autres termes, votre test vérifie s'il y a plus d'un bit "1" dans la représentation binaire $n. Si zéro ou un seul bit est défini, votre test sera faux.

C'est de loin le moyen le plus efficace de déterminer cette propriété.

+1

Greg, la question est, essentiellement, une adaptation qui teste si un nombre n'est pas une puissance de deux. Sans '== 0' PHP prend n'importe quelle valeur non nulle comme vraie. –

+0

Oui, je pensais que la négation logique serait claire. Néanmoins, j'ai modifié ma réponse pour que cela soit explicite. –

+0

Eh bien, ce n'est pas de la négation à première vue (ce serait '! = 0'), et mon impression de eyze est qu'il est au niveau d'un débutant. –

5

D'abord, ce code est valide PHP, donc votre titre est pauvre.

En second lieu, l'arithmétique binaire en cours ressemble à quelque chose comme ceci:

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

Comme Greg affirme ceci est le meilleur moyen de vérifier une puissance de 2 numéro, mais le code que vous avez donné des contrôles pour voir si le numéro est pas une puissance de 2. Cela peut facilement être vérifié par la politique de PHP: toute valeur non nulle/non nulle est vraie.