IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Opérateurs sur les bits : compréhension


Sujet :

Langage PHP

  1. #1
    Membre expérimenté
    Avatar de Jarodd
    Profil pro
    Inscrit en
    Août 2005
    Messages
    851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 851
    Points : 1 717
    Points
    1 717
    Par défaut Opérateurs sur les bits : compréhension
    Bonjour,

    Je suis en train de découvrir les opérateurs sur les bits. J'ai bien compris le &, le |, et le ^. Mais je bloque sur le ~ (not). La doc précise Les bits qui sont positionnés à 1 dans $a sont positionnés à 0, et vice-versa.

    Je vais quelques tests pour comprendre comment cela fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $a = 1; // soit 01 en binaire
    $b = 2; // soit 10 en binaire
    echo ~ $a;
    echo ~ $b;
    Je m'attendais à avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // pour  ~ $a :
    4294967294
    // soit en binaire 11111111111111111111111111111110
    // puisque ma valeur de départ est 00000000000000000000000000000001
     
    // pour ~ $b :
    4294967293
    // soit en binaire 11111111111111111111111111111101
    // puisque ma valeur de départ est 00000000000000000000000000000010
    Or j'obtiens -2 et -3

    Je n'arrive pas à comprendre ce résultat. Est-ce à cause d'une mauvaise interprêtation de la doc ? D'une mauvaise config PHP ? d'Obiwan Kenobi qui s'est fait racheter par Mickey ?

    Bref je me sens équivalent à un 0 sur ce coup... J'espère que vous pourrez m'aider à passer à 1 !

    Merci pour vos conseils

  2. #2
    Membre éprouvé Avatar de vorace
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2010
    Messages
    573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2010
    Messages : 573
    Points : 915
    Points
    915
    Par défaut
    sur la même page :
    The NOT or complement operator ( ~ ) and negative binary numbers can be confusing.

    ~2 = -3 because you use the formula ~x = -x - 1 The bitwise complement of a decimal number is the negation of the number minus 1.

    NOTE: just using 4 bits here for the examples below but in reality PHP uses 32 bits.

    Converting a negative decimal number (ie: -3) into binary takes 3 steps:
    1) convert the positive version of the decimal number into binary (ie: 3 = 0011)
    2) flips the bits (ie: 0011 becomes 1100)
    3) add 1 (ie: 1100 + 0001 = 1101)

    You might be wondering how does 1101 = -3. Well PHP uses the method "2's complement" to render negative binary numbers. If the left most bit is a 1 then the binary number is negative and you flip the bits and add 1. If it is 0 then it is positive and you don't have to do anything. So 0010 would be a positive 2. If it is 1101, it is negative and you flip the bits to get 0010. Add 1 and you get 0011 which equals -3.
    Développeur informatique contrarié...

  3. #3
    Membre expérimenté
    Avatar de Jarodd
    Profil pro
    Inscrit en
    Août 2005
    Messages
    851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 851
    Points : 1 717
    Points
    1 717
    Par défaut
    Ok merci pour les explications, je n'étais pas allé dans les commentaires, ne sachant jamais s'ils disent la vérité ou pas. Je préfère m'en tenir aux exemples de la doc mais sur cette page c'est assez succint.

    Si je fais une traduction sommaire de l'exemple, cela donne ceci :

    Formule de conversion => ~x = -x - 1
    La conversion d'un nombre décimal négatif (par exemple-3) en binaire se fait en 3 étapes :
    1) conversion de la version positive du nombre décimal en binaire(3 = 0011)
    2) inversion des bites (0011 becomes 1100)
    3) ajout d'1 bit (1100 + 0001 = 1101)

    Pourquoi 1101 = -3 ?
    PHP utilise la méthode "complément de 2" pour rentre négatif les nombres binaires négatifs
    Si le bits le plus à gauche est un 1 alors le nombre binaire est négatif donc on inverse et on ajoute 1
    Si c'est un 0, il est positif, donc on ne fait rien
    0010 sera un 2 positif
    1101 sera un 2 négatif, et on inversera pour obtenir 0010, puis en ajoutant 1 on obtient 0011 qui équivaut à -3
    J'avoue que cette logique me laisse perplexe Mais je ne manipule pas souvent du binaire donc ceci explique cela, je vais m'entraîner...

    Merci vorace !

Discussions similaires

  1. entiers 64 bits et operateurs sur les bits
    Par xantares dans le forum C
    Réponses: 9
    Dernier message: 25/03/2007, 17h23
  2. AND logique sur les bits
    Par edam dans le forum Bases de données
    Réponses: 4
    Dernier message: 24/02/2007, 19h26
  3. Réponses: 3
    Dernier message: 28/07/2006, 10h16
  4. Manipulations sur les bits
    Par ThE_LaSt dans le forum C
    Réponses: 23
    Dernier message: 27/03/2006, 14h22
  5. opérations sur les bits d'un byte
    Par petitours dans le forum C++Builder
    Réponses: 4
    Dernier message: 10/02/2004, 20h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo