J'utilise souvent ($var & 1) dans mon code, qui renvoie vrai si $var est un nombre impair et faux si c'est un nombre pair.
Je viens de me rendre compte que je n'ai aucune idée de ce que "&" fait réellement. Quelqu'un peut m'expliquer ?
J'utilise souvent ($var & 1) dans mon code, qui renvoie vrai si $var est un nombre impair et faux si c'est un nombre pair.
Je viens de me rendre compte que je n'ai aucune idée de ce que "&" fait réellement. Quelqu'un peut m'expliquer ?
& est binaire and
. Si vous avez une valeur binaire, et que vous and
avec une autre valeur binaire, alors le résultat sera la valeur bit par bit and
des deux. Un exemple :
01101010
& 01011001
= 01001000
Le bit le plus à droite est soit un 1 (et dans ce cas le nombre est un nombre impair) soit un 0, auquel cas le nombre est pair. Si vous &
un nombre avec 1, vous ne regardez que le bit le moins significatif, et le if vérifie si le nombre est un 1 ou un 0. Comme d'autres l'ont mentionné, consultez les opérateurs bit à bit pour savoir comment ils fonctionnent.
Deux opérations fondamentales pour les systèmes binaires sont OR et AND.
OR signifie "si A est allumé ou si B est allumé". Un exemple concret serait deux interrupteurs en parallèle. Si l'un d'entre eux laisse passer le courant, alors le courant passe.
AND signifie "si A et B sont tous deux activés". L'exemple du monde réel est celui de deux interrupteurs en série. Le courant ne passera que si les deux interrupteurs permettent le passage du courant.
Dans un ordinateur, ce ne sont pas des commutateurs physiques mais des semi-conducteurs, et leur fonctionnalité est appelée portes logiques . Ils font le même genre de choses que les interrupteurs - ils réagissent au courant ou à l'absence de courant.
Lorsqu'ils sont appliqués à des nombres entiers, chaque bit d'un nombre est combiné à chaque bit de l'autre nombre. Ainsi, pour comprendre les opérateurs binaires OR et AND, vous devez convertir les nombres en binaire, puis effectuer l'opération OR ou AND sur chaque paire de bits correspondants.
C'est pourquoi :
00011011 (odd number)
AND
00000001 (& 1)
==
00000001 (results in 1)
Considérant que
00011010 (even number)
AND
00000001 (& 1)
==
00000000 (results in 0)
L'opération (& 1) compare donc le bit le plus à droite à 1 en utilisant la logique ET. Tous les autres bits sont effectivement ignorés car tout ce qui est ET rien n'est rien.
Les autres opérations fondamentales des systèmes binaires sont NOT et XOR. NOT signifie "si A est éteint" et est la seule forme de porte logique qui ne prend qu'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 en fait juste NOT combiné à AND, OR et XOR, c'est-à-dire que NAND signifie "si A et B sont activés". pas les deux en même temps".
En programmation, l'opérateur
& means AND,
| means OR,
~ means NOT, and
^ means XOR.
Les autres peuvent être constituées en les combinant, par exemple :
~ (a & b) is equivalent to a NAND operation
Note spécifique PHP
En PHP, l'opérateur & ne fonctionne que sur les entiers, et les valeurs flottantes seront implicitement converties. Les nombres en dehors de la plage qui peut être exprimée sous forme d'entiers seront tronqués à zéro - c'est-à-dire que tous les nombres supérieurs à PHP_INT_MAX auront l'air "pairs" dans l'expression. ($num & 1)
). Si vous voulez supporter des nombres en dehors de PHP_INT_MIN/PHP_INT_MAX, vous aurez besoin de fmod($num, 2)
. Cependant, si vous êtes sous PHP 64 bits, vos entiers auront de toute façon une plus grande précision que les flottants.
Il est également intéressant de savoir ce qu'est le bitwise et le 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
Je sais que votre question porte sur 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 plutôt l'opérateur modulo :
($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 c'est plus générique, donc vous pouvez utiliser ($var % 3) de la même manière et déduire comment cela fonctionne pour n'importe quel N.
En plus des autres réponses, il est intéressant de noter que
if(func1() && func2())
N'appelle que func2()
si func1()
retourne vrai ("évaluation paresseuse"), alors que
if(func1() & func2())
Les deux fonctions seront appelées de toute façon, mais les tables de vérité des deux seront les mêmes (en supposant qu'elles retournent des booléens).
thomasrutter fait remarquer (dans les commentaires ci-dessous) que vous ne devriez probablement pas faire ce dernier point en pratique. (A & B)
n'aura pas nécessairement la même véracité que (A && B)
en particulier lorsque A
et B
sont des nombres entiers. Par exemple, si A=1 et B=2 (tous deux véridiques), A & B seront faux, alors que A && B est véridique. De plus, un autre développeur peut penser qu'il s'agit d'une faute de frappe et la "corriger" en deux esperluettes.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.