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...

Une réponse à Tips : Opérateurs bit à bit

  1. Fylhan


    #include

    int main(void) {
    int x;
    int i;
    for(i=0; i 0; ++i)
    {
    if (i == 1) {
    int tmp =x;
    scanf("%x",&x);
    printf("%x %x : %d\n", tmp, x, (tmp<>3);
    printf("%d\n", x&(0b111));
    continue;
    }
    printf("%d\n", x);
    }
    return 0;
    }

    Useful links:
    * https://en.wikipedia.org/wiki/Bitwise_operations_in_C
    * http://www.bien-programmer.fr/bits.htm

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*