PHP opérateur &
Résolu/Fermé
Lazarey
Messages postés
3239
Date d'inscription
vendredi 3 novembre 2006
Statut
Membre
Dernière intervention
21 mai 2012
-
19 déc. 2007 à 14:39
Denis Dee Jay Messages postés 4 Date d'inscription mardi 3 février 2009 Statut Membre Dernière intervention 22 septembre 2010 - 16 juin 2010 à 09:54
Denis Dee Jay Messages postés 4 Date d'inscription mardi 3 février 2009 Statut Membre Dernière intervention 22 septembre 2010 - 16 juin 2010 à 09:54
A voir également:
- PHP opérateur &
- Easy php - Télécharger - Divers Web & Internet
- 0650 quel opérateur - Forum Opérateurs & Réseaux mobiles
- 0473 quel opérateur - Forum Loisirs / Divertissements
- 0466 quel opérateur - Forum Mobile
- 0758 quel opérateur - Forum Opérateurs & Réseaux mobiles
10 réponses
Reivax962
Messages postés
3672
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
1 011
19 déc. 2007 à 15:06
19 déc. 2007 à 15:06
Bonjour,
Alors, prenons l'exemple 9 & 12.
En binaire, 9 s'écrit 1001, et 12 s'écrit 1100.
La comparaison bit-à-bit signifie que sur ces deux nombres, 1001 et 1100, on va comparer les chiffres deux à deux.
Le premier chiffre : 1 d'un côté, 1 de l'autre. On fait donc 1 ET 1, qui vaut... 1.
Le deuxième chiffre : 0 d'un côté, 1 de l'autre. On fait donc 0 ET 1, qui vaut... 0.
Le troisième chiffre : 0 d'un côté, 0 de l'autre. On fait donc 1 ET 1, qui vaut... 0.
Le quatrième chiffre : 1 d'un côté, 0 de l'autre. On fait donc 1 ET 1, qui vaut... 0.
Ce qui donne, au final, 1000, soit, en décimal, 8.
Si on en vient à la ligne if (! $flags & 1)
Imaginons que $flags vale, en binaire, 10010x
L'opérateur ! est prioritaire, donc on va comparer en fait !x à 1
!$flags & 1 vaut donc 1 si !x=1, et 0 si !x=0. Donc !$flag & 1 vaut !x.
Et au final, cette ligne veut simplement dire "SI x VAUT 0"
Autrement dit, si le bit de plus faible poids de $flags est à 0.
Ou encore, si $flags est pair.
Voilà, j'espère que je t'ai aidé...
Xavier
Alors, prenons l'exemple 9 & 12.
En binaire, 9 s'écrit 1001, et 12 s'écrit 1100.
La comparaison bit-à-bit signifie que sur ces deux nombres, 1001 et 1100, on va comparer les chiffres deux à deux.
Le premier chiffre : 1 d'un côté, 1 de l'autre. On fait donc 1 ET 1, qui vaut... 1.
Le deuxième chiffre : 0 d'un côté, 1 de l'autre. On fait donc 0 ET 1, qui vaut... 0.
Le troisième chiffre : 0 d'un côté, 0 de l'autre. On fait donc 1 ET 1, qui vaut... 0.
Le quatrième chiffre : 1 d'un côté, 0 de l'autre. On fait donc 1 ET 1, qui vaut... 0.
Ce qui donne, au final, 1000, soit, en décimal, 8.
Si on en vient à la ligne if (! $flags & 1)
Imaginons que $flags vale, en binaire, 10010x
L'opérateur ! est prioritaire, donc on va comparer en fait !x à 1
!$flags & 1 vaut donc 1 si !x=1, et 0 si !x=0. Donc !$flag & 1 vaut !x.
Et au final, cette ligne veut simplement dire "SI x VAUT 0"
Autrement dit, si le bit de plus faible poids de $flags est à 0.
Ou encore, si $flags est pair.
Voilà, j'espère que je t'ai aidé...
Xavier
Je veux dire qu'il y a une erreur dans l'explication de Reivax962 et dans sa conclusion Et au final, cette ligne veut simplement dire "SI x VAUT 0"
il appelle x le bit de poids faible de $flag
or en faisant if (!$flags & 1) , on teste en fait "SI $flags VAUT 0" et non pas "SI le bit de poids faible de $flags VAUT 0".
pour ne tester que le bit de poids faible, on peut faire if (~$flags & 1) ou if (!($flags & 1))
! est un opéraleur logique qui transforme true en false et réciproquement.
en PHP, tout ce qui est différent de 0 est évalué comme true pour les opérations logiques
donc si $flags vaut 100100 binaire par exemple, c'est true et donc !$flags vaut false
false est ensuite traduit en 0 pour pouvoir faire un et bit à bit (&) avec 1 (opération numérique)
Le résultat de ce & est 0
qui est false
~ est un opéraleur numérique qui transforme les 0 en 1 et réciproquement dans un nombre entier
donc si $flags vaut 100100 binaire par exemple, ~$flags vaut 011011
on fait un et bit à bit (&) avec 1
Le résultat de ce & est 1
qui est true
c'est bien la variante avec ~ qui donne true si le bit de poids faible est à 0, pas l'expression que tu avais proposée au départ
il appelle x le bit de poids faible de $flag
or en faisant if (!$flags & 1) , on teste en fait "SI $flags VAUT 0" et non pas "SI le bit de poids faible de $flags VAUT 0".
pour ne tester que le bit de poids faible, on peut faire if (~$flags & 1) ou if (!($flags & 1))
! est un opéraleur logique qui transforme true en false et réciproquement.
en PHP, tout ce qui est différent de 0 est évalué comme true pour les opérations logiques
donc si $flags vaut 100100 binaire par exemple, c'est true et donc !$flags vaut false
false est ensuite traduit en 0 pour pouvoir faire un et bit à bit (&) avec 1 (opération numérique)
Le résultat de ce & est 0
qui est false
~ est un opéraleur numérique qui transforme les 0 en 1 et réciproquement dans un nombre entier
donc si $flags vaut 100100 binaire par exemple, ~$flags vaut 011011
on fait un et bit à bit (&) avec 1
Le résultat de ce & est 1
qui est true
c'est bien la variante avec ~ qui donne true si le bit de poids faible est à 0, pas l'expression que tu avais proposée au départ
Reivax962
Messages postés
3672
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
1 011
20 déc. 2007 à 10:38
20 déc. 2007 à 10:38
Oui effectivement, désolé pour la petite approximation...
Mais il se peut, dans ce cas, que la ligne en question ne fasse pas ce qu'elle était censée faire ;)
Mais il se peut, dans ce cas, que la ligne en question ne fasse pas ce qu'elle était censée faire ;)
Lazarey
Messages postés
3239
Date d'inscription
vendredi 3 novembre 2006
Statut
Membre
Dernière intervention
21 mai 2012
745
19 déc. 2007 à 15:26
19 déc. 2007 à 15:26
OK merci.
C'était pas bien méchant en fin de compte. En tout cas, j'ai bien compris.
Merci beaucoup.
A+
C'était pas bien méchant en fin de compte. En tout cas, j'ai bien compris.
Merci beaucoup.
A+
Bonjour
Imaginons que $flags vale, en binaire, 10010x
L'opérateur ! est prioritaire, donc on va comparer en fait !x à 1
euh... non. ! 10010x vaut false, que x vaille 0 ou 1
il aurait fallu faire ~flags & 1 pour tester le bit de poids faible de $flags
C'est toute la différence entre le ! logique et le ~ bit à bit
Imaginons que $flags vale, en binaire, 10010x
L'opérateur ! est prioritaire, donc on va comparer en fait !x à 1
euh... non. ! 10010x vaut false, que x vaille 0 ou 1
il aurait fallu faire ~flags & 1 pour tester le bit de poids faible de $flags
C'est toute la différence entre le ! logique et le ~ bit à bit
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Lazarey
Messages postés
3239
Date d'inscription
vendredi 3 novembre 2006
Statut
Membre
Dernière intervention
21 mai 2012
745
19 déc. 2007 à 16:35
19 déc. 2007 à 16:35
????
Merci, mais je ne comprends pas ce que tu veux dire.
Merci, mais je ne comprends pas ce que tu veux dire.
Lazarey
Messages postés
3239
Date d'inscription
vendredi 3 novembre 2006
Statut
Membre
Dernière intervention
21 mai 2012
745
20 déc. 2007 à 08:42
20 déc. 2007 à 08:42
OK, j'ai compris (ça m'a travaillé cette nuit).
En tout cas, ma fonction fonctionne.
Merci beaucoup pour ce petit cours ;)
Et a bientôt......
En tout cas, ma fonction fonctionne.
Merci beaucoup pour ce petit cours ;)
Et a bientôt......
Bonjour
Mais il se peut, dans ce cas, que la ligne en question ne fasse pas ce qu'elle était censée faire ;)
C'est même pratiquement sûr. Sinon, on se serait contenté d'écrire if (!$flags) qui fait exactement la même chose que if (!$flags & 1)
Mais il se peut, dans ce cas, que la ligne en question ne fasse pas ce qu'elle était censée faire ;)
C'est même pratiquement sûr. Sinon, on se serait contenté d'écrire if (!$flags) qui fait exactement la même chose que if (!$flags & 1)
j'ai comme l'impression que le binaire, c très très loin....
"Le premier chiffre : 1 d'un côté, 1 de l'autre. On fait donc 1 ET 1, qui vaut... 1. " ->d'accord...
"Le deuxième chiffre : 0 d'un côté, 1 de l'autre. On fait donc 0 ET 1, qui vaut... 0. "->pourquoi pas...
"Le troisième chiffre : 0 d'un côté, 0 de l'autre. On fait donc 1 ET 1, qui vaut... 0." -> pareil que 1 d'un côté et 1 de l'autre ? bobo la têteuh
"Le quatrième chiffre : 1 d'un côté, 0 de l'autre. On fait donc 1 ET 1, qui vaut... 0."-> :$
où peut-on trouver une explication plus approfondie ?
"Le premier chiffre : 1 d'un côté, 1 de l'autre. On fait donc 1 ET 1, qui vaut... 1. " ->d'accord...
"Le deuxième chiffre : 0 d'un côté, 1 de l'autre. On fait donc 0 ET 1, qui vaut... 0. "->pourquoi pas...
"Le troisième chiffre : 0 d'un côté, 0 de l'autre. On fait donc 1 ET 1, qui vaut... 0." -> pareil que 1 d'un côté et 1 de l'autre ? bobo la têteuh
"Le quatrième chiffre : 1 d'un côté, 0 de l'autre. On fait donc 1 ET 1, qui vaut... 0."-> :$
où peut-on trouver une explication plus approfondie ?
Denis Dee Jay
Messages postés
4
Date d'inscription
mardi 3 février 2009
Statut
Membre
Dernière intervention
22 septembre 2010
1
15 juin 2010 à 15:22
15 juin 2010 à 15:22
Salut,
Moi aussi je bute un peu sur cette partie :
Le coups du "1 ET 1, qui vaut... 1" puis "1 ET 1, qui vaut... 0" ... space :)
Quelqu'un aurait une url pour expliquer ce mode de calcul?
Merci :)
Moi aussi je bute un peu sur cette partie :
Le premier chiffre : 1 d'un côté, 1 de l'autre. On fait donc 1 ET 1, qui vaut... 1. Le deuxième chiffre : 0 d'un côté, 1 de l'autre. On fait donc 0 ET 1, qui vaut... 0. Le troisième chiffre : 0 d'un côté, 0 de l'autre. On fait donc 1 ET 1, qui vaut... 0. Le quatrième chiffre : 1 d'un côté, 0 de l'autre. On fait donc 1 ET 1, qui vaut... 0. Ce qui donne, au final, 1000, soit, en décimal, 8.
Le coups du "1 ET 1, qui vaut... 1" puis "1 ET 1, qui vaut... 0" ... space :)
Quelqu'un aurait une url pour expliquer ce mode de calcul?
Merci :)
Reivax962
Messages postés
3672
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
1 011
15 juin 2010 à 16:39
15 juin 2010 à 16:39
C'est simplement une erreur de copier-coller :)
Le premier chiffre : 1 d'un côté, 1 de l'autre. On fait donc 1 ET 1, qui vaut... 1.
Le deuxième chiffre : 0 d'un côté, 1 de l'autre. On fait donc 0 ET 1, qui vaut... 0.
Le troisième chiffre : 0 d'un côté, 0 de l'autre. On fait donc 0 ET 0, qui vaut... 0.
Le quatrième chiffre : 1 d'un côté, 0 de l'autre. On fait donc 1 ET 0, qui vaut... 0.
C'est mieux :p
Le premier chiffre : 1 d'un côté, 1 de l'autre. On fait donc 1 ET 1, qui vaut... 1.
Le deuxième chiffre : 0 d'un côté, 1 de l'autre. On fait donc 0 ET 1, qui vaut... 0.
Le troisième chiffre : 0 d'un côté, 0 de l'autre. On fait donc 0 ET 0, qui vaut... 0.
Le quatrième chiffre : 1 d'un côté, 0 de l'autre. On fait donc 1 ET 0, qui vaut... 0.
C'est mieux :p
Denis Dee Jay
Messages postés
4
Date d'inscription
mardi 3 février 2009
Statut
Membre
Dernière intervention
22 septembre 2010
1
16 juin 2010 à 09:54
16 juin 2010 à 09:54
Ah bah oui, effectivement, là je comprend mieux la logique ^^
Merci :)
Merci :)