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