Probleme binaire en php [Résolu]

Signaler
Messages postés
49
Date d'inscription
samedi 7 juillet 2007
Statut
Membre
Dernière intervention
5 mai 2017
-
Messages postés
49
Date d'inscription
samedi 7 juillet 2007
Statut
Membre
Dernière intervention
5 mai 2017
-
bonsoir à tous,

Je vous prie de m'aider dans ce code mes amis :

Introduction
$dataBin est un tableau qui contient une chaine binaire,
$r contient la chaine binaire de la composante R du RGB

Code :
$i= 0;
if ($dataBin[$i]=="1") // si le bit traité est égale à 1 alors faire
$r|=0x01;
else if ($r%2==1)
$r-=1;
$i++;

Alors mon problème, je comprend pas ce que l'instruction $r|=0x01; : puisque elle contient le "|" qui est le ou logique, je sais que ca veut dire : $r = $r | 0x01 mais qu'est ce que ca serai résultat....


Aidez moi mes amis SVP, et ne m'envoyez pas à Wikipedia pour lire l'explication de ou logique, je l'ai deja fait, je cherche à le comprendre ici

Merci

4 réponses

Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
27
Salut,

Tu vas à l'essentiel dans ton message, et c'est très bien, mais du coup j'ai presque envie de te dire d'aller voir Wikipedia, parce que je ne comprends pas ... ce que tu ne comprends pas.

Avec un exemple peut être ...

<?php
$dataBin = array(1,0);
$r = 3;

$i=0;
for($y = 0; $y < 2; $y++) {

    if ($dataBin[$i]=="1") { // si le bit traité est égale à 1 alors faire
        /*
         *
         * $r|=0x01 est égal à $r = $r | 0x01
         *
         * (hexa)0x01 (bin)1 masque sur le premier bit
         *
         * (dec)3 = (bin)11
         *
         * $r 11 OR 1 (bin)11 == (dec)3 
         *
         * Si $r valait 250 :
         * (dec)250 == (bin)11111010
         * 
         * $r 11111010 | 1 11111011 == (dec)251
         *
        */

        $r|=0x01;
        
    } else if ($r%2==1) {
        /*
         * si le modulo de $r donne 1 on décrémente 1 fois $r
         * (cas pour $dataBin[1])
         */
        $r-=1;
    }
    $i++;
}
?>


Je ne suis pas sur de t'être d'une grande aide. Si c'est le cas précise un peu plus ton incompréhension (notamment ce que valent $r et $databin)

Cordialement,

Kohntark -
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
27
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 '[supprimerMessage.html supprimer le message]';

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 -
Messages postés
49
Date d'inscription
samedi 7 juillet 2007
Statut
Membre
Dernière intervention
5 mai 2017

salut Kohntarl,

Merci beaucoup pour ta précieuse réponse, tu m'a vraiment éclaircis mon flou,
en fait, t'avais raison moi même je n'était pas claire, maintenant je comprend mieux mon problème :

1) Ne m'en veut pas : le masque sur le premier bit, c'est ca l'application du "ou" ?
2) $r|= 0x01 veut dire donc application d'un masque sur le premier bit ??
3) et l'application d'un masque, comment ca se fait
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 ???


Je m'excuse mon Kohntarl, je sais que ca à l'aire tres bete, (de ne pas connaitre un masque ou son application), mais c'est la vérité, enfin
J'espere avoir une réponse favorable.

Je comprend enfin que mon probleme c'est le masque,

et si je change 0x01 par 0x02, ca veut dire : appliquer le masque sur les deux premiers bits (les deux bits de poids faible)???




Merci beaucoup mon ami.
Sincèrement, Jarod.
Messages postés
49
Date d'inscription
samedi 7 juillet 2007
Statut
Membre
Dernière intervention
5 mai 2017

merci beaucoup mon ami, tout est claire et net.
que dieu sois avec toi.