Réponse acceptée !
1) Ne m'en veut pas : le masque sur le premier bit, c'est ca l'application du "ou" ?
Tu fais ce que tu veux avec ces fonctions binaires, pas forcément un masque ...
2) $r|=0x01 veut dire donc application d'un masque sur le premier bit ??
Je parlais de masque car ça pourrait être le cas, mais n'ayant pas tout le code il est difficile de savoir à quoi il sert réellement. Il s'agit peut être d'autre chose.
3) et l'application d'un masque, comment ca se fait
Un masque sert à retirer un ou plusieurs bits, ou ne pas tenir compte de certains d'entre eux.
Prenons l'exemple basique d'un forum :
Le but est d'autoriser certaines fonctionnalités en fonction des droits attribués.
On code sur 4 bits :
bit 0 => visualiser un message
bit 1 => écrire un message
bit 2 => supprimer un message
bit 3 => éditer un message
Admettons les utilisateur suivants :
Machin est visiteur => (dec)1 == (bin)0001 == uniquement visualiser (bit 0)
Truc est membre => (dec)3 == (bin)0011 == visualiser et écrire (bits 0 et 1)
Bidule est modérateur => (dec)7 == (bin)0111 == visu, écriture et suppression
Boss est administrateur => (dec)15 == (bin)1111 == tous les droits
On veut afficher un lien "supprimer le message" si l'utilisateur a ce droit.
Le bit "supprimer un message" est le troisième, donc (hexa)0x4 ((bin) 0100)
if ([droits de l'utilisateur] & 0x4) echo '<a href="supprimerMessage.html">supprimer le message</a>';
Ce qui donne :
Machin :
0001 & 0100 == false (pas d'affichage du lien)
Truc :
0011 & 0100 == false
Bidule :
0111 & 0100 == true (affichage du lien)
Boos :
1111 & 0100 == true
On utilise ici la fonction "et" qui est plus adaptée et qui correspond plus à la terminologie de masque, mais un "masque" peut utiliser n'importe quoi (AND, OR, XOR) tout dépend de ce que l'on souhaite faire.
Dans ton code le $r|=0x01; permet de positionner le bit de poids le plus faible à 1 quelque soit sa valeur.
4) je vois que :
$r = 11111010 | 1 == 11111011 == (dec)251
le bit de poids faible est changé par 1, donc le masque est traduit par le changement du premier bit par le bit du deuxième opérande ???
Le bit de poids le plus faible est toujours égal à 1, qu'il soit à 0 ou à 1
et si je change 0x01 par 0x02, ca veut dire : appliquer le masque sur les deux premiers bits (les deux bits de poids faible)???
Non, tu es en hexa là, donc :
(hex)0x01 (ou 0x1) == (bin)0001 (applique le "ou" sur le premier bit)
(hex)0x2 == (bin)0010 (applique le "ou" sur le second bit)
0001 | 0x1 = 0001 == (dec)1
0001 | 0x2 = 0011 == (dec)3
0010 | 0x1 = 0011 == (dec)3
0010 | 0x2 = 0010 == (dec)2
Pour appliquer le "ou" sur les deux premiers bits il faudrait faire :
0011 (les 2 premiers) == (dec)3 == (hex)0x3
0001 | 0x3 = 0011 == (dec)3
0010 | 0x3 = 0011
((dec)255) 11111111 | 0x3 = 11111111 == (dec)255
((dec)250) 11111010 | 0x3 = 11111011 == (dec)251
Si tu as des difficultés avec le traitement binaire tu peux peut être faire une recherche sur "table de vérité binaire". Je n'ai pas regardé mais je pense que ça donnera de meilleurs résultats que Wikipedia pour l'aspect didactique.
J'ai écrit un peu vite, et ne me suis pas relu en profondeur, j'espère ne pas avoir fait d'erreur. Que les autres lecteurs n'hésitent pas à me taper dessus si c'est le cas
Cordialement,
Kohntark -