2013-02-01 7 views
2

Possible en double:
Reference - What does this symbol mean in PHP?et comme opérateur arithmétique en PHP

Je travaille sur un code existant où je suis tombé sur la fonction suivante:

function is_odd($number) { 
    return $number & 1; // 0 = even, 1 = odd 
} 

Je n'ai jamais vu une méthode pour vérifier si un nombre est impair écrit comme ça avant et j'essaie juste de derstand ce qu'ils font réellement.

+0

http://en.wikipedia.org/wiki/Bitwise_operation –

+3

[Référence - Que signifie ce symbole en PHP?] (http: // stackoverflow.com/questions/3737139/reference-what-does-this-symbol-mean-in-php) –

+0

Ceci est plus d'un mathématique question plutôt qu'une question PHP pour être honnête. –

Répondre

7

& est un bitwise-and, il fonctionne essentiellement de sorte que pour chaque bit qui est 1 dans les deux opérandes, il donne 1 de la valeur résultante et 0 pour tous les autres bits. Si vous convertissez un nombre quelconque de sa représentation binaire, vous voyez rapidement que c'est le bit le plus bas qui détermine si un nombre est pair ou impair, par exemple:

5 = 101 
    10 = 1010 
    13 = 1101 
1030 = 10000000110 

Le bit le plus bas (celui du très bon, aussi appelé le bit le moins significatif) est 1 pour chaque nombre impair et 0 pour chaque nombre pair. Faire $n & 1 donnera toujours 0 pour chaque autre bit que le bit le plus bas (parce que le nombre 1 a seulement un bit, vous pouvez imaginer que le reste des bits est complété avec 0 pour correspondre à la longueur de l'autre opérande). Donc, fondamentalement, l'opération se résume à comparer le bit le plus bas des opérandes, et 1 & 1 est 1, toutes les autres combinaisons sont 0. Donc, fondamentalement, lorsque le $n & 1 donne 1, cela signifie que le nombre est impair, sinon il est pair.

EDIT.

est ici quelques exemples pour montrer comment l'opérateur de bits et fonctionne pour les valeurs mon exemple précédent, le nombre entre parenthèses est le nombre décimal d'origine:

101 (5) 
& 001 (1) 
    --- 
    001 (1) = true 


    1010 (10) 
& 0001 (1) 
    ---- 
    0000 (0) = false 


    1101 (13) 
& 0001 (1) 
    ---- 
    0001 (1) = true 


    10000000110 (1030) 
& 00000000001 (1) 
    ----------- 
    00000000000 (0) = false 

De cela, vous pouvez facilement voir que le résultat n'est vrai que lorsque les bits les plus à droite des deux opérandes sont 1.