Tips : Opérateurs bit à bit

Publié dans Geekeries | Marqué avec
Share

Si vous n’êtes pas familiarisé avec les opérateurs bit à bit (aussi appelés opérateurs binaires), lisez donc un des articles ci dessous (ou mieux, lisez-les tous !) :

Maintenant, ce qui suit sont mes petits penses-bêtes pour me rappeler ce que je dois utiliser lorsque je veux récupérer / modifier une partie d’un octet.

Opérateur &

  • bit & 1 : le bit reste inchangé.
    • Quelques exemples :
      • 1 & 1 = 1
      • 0 & 1 = 0
  • bit & 0 : le bit devient toujours 0.
    • Quelques exemples :
      • 1 & 0 = 0
      • 0 & 0 = 0
      • 0101 0011 & 0000 1111 = 0000 0011

Donc, l’opérateur & est utile lorsque l’on souhaite passer un bit d’un octet à 0.

Opérateur |

  • bit | 1 : le bit devient toujours 1.
    • Quelques exemples :
      • 1 | 1 = 1
      • 0 | 1 = 1
  • bit | 0 : le bit reste inchangé.
    • Quelques exemples :
      • 1 | 0 = 1
      • 0 | 0 = 0
      • 0101 0011 | 0000 1111 = 0101 1111

Donc, l’opérateur | est utile lorsque l’on souhaite passer un bit d’un octet à 1.

Opérateurs >> ou <<

Ces opérateurs décalent d’un bit respectivement vers la gauche ou la droite. Donc pour décaler d’un octet (ou d’un byte) : >> 8 ou << 8.

  • Quelques exemples :
    • 0xFFFF >> 8 donne 0x00FF
    • 0xFFFF << 8 donne 0xFF00

Prenons un exemple plus pratique. J'ai une variable "unsigned short" (donc 2 octets, c'est-à-dire 16 bits) contenant la valeur "32 769", soit en héxadécimal "0x8001". Pour rappel,"unsigned char" -> 1 octet, c'est-à-dire 8 bits.

  • Pour copier cette valeur dans un tableau d'octet en big endian :
    data[0] = (unsigned char)(0x8001>>8); // 0x80
    data[1] = (unsigned char)(0x8001); // 0x01
    
  • Pour l'opération inverse, toujours en big endian :

    unsigned short var1 = ((unsigned short)data[0])<<8; // 0x8000 unsigned short var2 = (unsigned short)data[1]; // 0x0001 unsigned short result= var1+var2; // 0x8001 [/code]

    Little et big endian

    En big endian, la valeur 0x1441 (sur 2 octets) donne une fois dans la payload : | 0x14 | 0x41 |, bref, naturellement !
    En littleendian, la valeur 0x1441 (sur 2 octets) donne une fois dans la payload : | 0x41 | 0x14 |, bref, petite prise de tête !

    To be continued. Maybe...

One Response to Tips : Opérateurs bit à bit

Répondre à Fylhan Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *