2017-02-05 2 views
-8

J'ai une esquisse Arduino, qui est essentiellement C++, qui a ces lignes de code en elle:Que font les opérateurs | = et << =?

uint32_t cardid = uid[0]; 
cardid <<= 8; 
cardid |= uid[1]; 

L'Arduino est connecté à un lecteur RFID pn532 donc en gros il scanne la carte qui est à portée et impressions l'UID dessus.
Mais je ne comprends pas ce que les opérateurs | = et < < = faire.
J'ai trouvé en ligne qu'ils ont quelque chose à voir avec valarrays mais je n'ai jamais utilisé de telles choses. ce code génère

a <<= b --> a = a << b 
a |= b --> a = a | b 

Dans l'exemple donné, une valeur de 16 bits à partir de deux valeurs de bit 8:

+0

_ "ils ont quelque chose à voir avec valarrays" _ Non. Ce sont les opérateurs de décalage de bits OU et de gauche. –

+4

Downvoted pour le manque d'effort de recherche. Ce n'est pas difficile à google. –

Répondre

3

En général, ces opérateurs sont raccourcis. Compte tenu

uid[0] = 0x12 
uid[1] = 0x34 

puis

uint32_t cardid = uid[0]; // cardid is now 0x12 
cardid <<= 8;    // shifts the value 8 bits to the left -> 0x1200 
cardid |= uid[1];   // applies the OR operator -> 0x1200 | 0x34 = 0x1234 
0

Ce sont les opérateurs (écrit comme au niveau du bit raccourcis).

cardid < < = 8; est identique à cardid = (cardid < < 8); Ceci fait un décalage arithmétique vers la gauche, c'est-à-dire en multipliant essentiellement par 2^8 dans ce cas.

cardid | = uid [1]; est identique à cardid = (cardid | uid [1]); Ceci effectue un OU bit à bit, c'est-à-dire qu'il définit des bits dans cardid qui sont également définis dans uid.

1

C++ permet += *= |= &= ... ainsi dans votre cas où le premier <<= est appelé opérateur right shift assignment qui est un raccourci de décalage des bits de la même lValue assigner le résultat à elle-même:

int a = 7; 
a <<= 2; 
a = a << 2; // This line is identical to the one above. 

Le deuxième |= est appelé Bitwise Or Assignment opérateur qui est un raccourci de OU logique bit les bits du même lValue puis affecter le résultat à elle-même:

int a = 7; 
a |= 2; 
a = a | 2; // This line is identical to the one above. 
  • Les deux opérateurs travaillent sur des bits.