Question

J'utilise souvent ($ var & amp; 1) dans mon code, qui retourne true si $ var est un nombre impair et false s'il s'agit d'un nombre pair.

Mais qu'est-ce que "& amp; " fait réellement?

Était-ce utile?

La solution

& amp; est binaire et . Si vous avez une valeur binaire et que vous et avec une autre valeur binaire, le résultat sera alors le et au niveau du bit des deux. Un exemple:

  01101010
& 01011001
= 01001000

Le bit le plus à droite est soit 1 (et dans ce cas, le nombre est un nombre impair), soit 0, auquel cas le nombre est pair. Si vous & amp; un nombre avec 1, vous ne regardez que le bit le moins significatif, et le si vérifie si le nombre est un 1 ou un 0. Comme d'autres l'ont mentionné, regardez les opérateurs au niveau du bit pour infos sur leur fonctionnement.

Autres conseils

Deux opérations fondamentales pour les systèmes binaires sont OR et AND.

OU signifie "si A est activé ou B est activé". Un exemple concret serait deux commutateurs en parallèle. Si l’un des deux laisse passer le courant, le courant le traverse.

AND signifie 'si A et B sont allumés'. L'exemple du monde réel est constitué de deux commutateurs en série. Le courant ne passera que si les deux le permettent.

Sur un ordinateur, il s’agit de portes logiques . Ils font le même genre de choses que les commutateurs - réagissent au courant ou à aucun courant.

Appliquée aux nombres entiers, chaque bit d'un nombre est combiné à chaque bit de l'autre nombre. Donc, pour comprendre les opérateurs binaires OU et ET, vous devez convertir les nombres en binaires, puis effectuer les opérations OU ou ET sur chaque paire de bits correspondants.

C'est pourquoi:

00011011 (odd number)
AND
00000001 (& 1)
== 
00000001 (results in 1)

Attendu

00011010 (even number)
AND
00000001 (& 1)
==
00000000 (results in 0)

L'opération (& amp; 1) compare donc le bit le plus à droite à 1 en utilisant la logique AND. Tous les autres bits sont effectivement ignorés car rien ET rien n'est rien. Un nombre pair en binaire est également un nombre pair en notation décimale (10 est un multiple de 2).

Les autres opérations fondamentales des systèmes binaires incluent NOT et XOR. NOT signifie "si A est désactivé" et est la seule forme de porte logique qui accepte un seul signal ou "paramètre" au lieu de deux. XOR signifie «si A ou B est activé, mais pas les deux». Et puis il y a NAND, NOR et NXOR, qui sont fondamentalement simplement NON combinés avec AND, OR et XOR, c'est-à-dire que NAND signifie "si A et B ne sont pas tous les deux".

En programmation, l'opérateur

& means AND,
| means OR, 
~ means NOT, and
^ means XOR.

Les autres peuvent être composés en les combinant, par exemple:

~ (a & b) is equivalent to a NAND operation

Remarque spécifique à PHP

Les opérateurs au niveau des bits ne fonctionnent pas sur les valeurs à virgule flottante. En PHP, les valeurs à virgule flottante sont d'abord implicitement converties en entiers. Les nombres en dehors de la plage qui peuvent être exprimés en nombres entiers seront tronqués à zéro, c'est-à-dire que tous les nombres au-dessus de PHP_INT_MAX auront l'air "même". dans l'expression ($ num & amp; 1) ). Si vous souhaitez prendre en charge des numéros en dehors de PHP_INT_MIN / PHP_INT_MAX, vous aurez besoin de fmod ($ num, 2) . Si, toutefois, vous utilisez du PHP 64 bits, vos entiers auront de toute façon une précision supérieure à celle des flottants.

C’est également intéressant de connaître Bitwise et PHP:

/**
 * Regular
 */
echo (true && true); // 1
echo (true && false); // nothing

echo (true || false); // 1
echo (false || false); // nothing

echo (true xor false); // 1
echo (false xor false); // nothing

/**
 * Bitwise
 */
echo (true & true); // 1
echo (true & false); // 0

echo (true | false); // 1
echo (false | false); // 0

echo (true ^ false); // 1
echo (false ^ false); // 0

En plus des autres réponses, il convient de noter que

if(func1() && func2())

Appellera uniquement func2 () si func1 () renvoie true ("évaluation lazy"), alors que

if(func1() & func2())

Appellera les deux fonctions indépendamment, mais les tables de vérité pour les deux seront identiques (en supposant qu'elles renvoient des booléens).

thomasrutter fait remarquer (dans les commentaires ci-dessous) que vous ne devriez probablement pas faire ce dernier dans la pratique. (A & B) n'aura pas nécessairement la même véracité que (A & B & B) , en particulier lorsque A et < code> B sont des entiers. Par exemple, si A = 1 et B = 2 (les deux vrais), A & amp; B sera falsey, alors que A & & amp; B est la vérité. En outre, un autre développeur peut penser qu'il s'agit d'une faute de frappe et le "corriger" en deux esperluettes.

Je sais que votre question concerne la compréhension de l'opérateur bitwise et la réponse acceptée l'explique bien. Mais pour l'exemple que vous donnez, je ne peux m'empêcher de vous recommander d'utiliser l'opérateur modulo à la place:

($var % 2) /* instead of */ ($var & 1)

Parce que cela indique clairement que vous vérifiez que le nombre est impair (non divisible par deux), et qu'il est plus générique, vous pouvez donc utiliser ($ var% 3) de la même manière et en déduire le fonctionnement pour n'importe quel N.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top