Que signifie ‘<<' en C?

Qu’est-ce que ça veut dire?

#define WS_RECURSIVE (1 << 0) 

Je comprends que cela va définir WS_Recursive (1 << 0) mais que signifie << ?

Merci!

<< est l' opérateur de décalage à gauche . Il décale le nombre 1 de 0 bits à gauche, ce qui équivaut au nombre 1 .

Il est couramment utilisé pour créer des drapeaux , des nombres pouvant être combinés avec | (bit ou) et diverses opérations peuvent leur être appliquées, telles que vérifier si un indicateur est défini, définir un indicateur, supprimer un indicateur, etc.

La raison pour laquelle ils peuvent être combinés ensemble sans se gêner, c’est que chacun est une puissance de deux , et c’est la raison pour laquelle on utilise 1 << x , car cela donne une puissance de deux:

1 << 0 == 2 0 == 1 == binary 0001
1 << 1 == 2 1 == 2 == binary 0010
1 << 2 == 2 2 == 4 == binary 0100
1 << 3 == 2 3 == 8 == binary 1000
etc

Vous pouvez en savoir plus sur les indicateurs de bits ici: http://www.codeproject.com/KB/tips/Binary_Guide.aspx

C’est un peu décalé vers la gauche. Donc 1 << 0 est réellement 1. Il est généralement utilisé de cette façon lorsque vous voulez définir des drapeaux, chacun d'entre eux est un bit défini, par exemple:

 #define FLAG1 (1 << 0) #define FLAG2 (1 << 1) #define FLAG3 (1 << 2) #define FLAG4 (1 << 3) 

<< calcule un décalage binary vers la gauche. Décaler de 1 bit à gauche de 0 bits laisse simplement le résultat comme 1.

J'ai aussi remarqué d'où provient votre code. Il y a aussi:

 #define WS_RECURSIVE (1 << 0) #define WS_DEFAULT WS_RECURSIVE #define WS_FOLLOWLINK (1 << 1) #define WS_DOTFILES (1 << 2) #define WS_MATCHDIRS (1 << 3) 

C'est une façon de créer des champs de bits , où vous OU ( | ) ensemble, et ET ( & ) pour vérifier s'ils sont définis.

L’opérateur << décale la valeur de gauche laissée par les bits (valeur de droite). Votre exemple ne fait rien! 1 décalé de 0 bit vers la gauche correspond toujours à 1. Cependant, 1 << 1 correspond à 2, 1 << 2 correspond à 4, etc. WS_RECURSIVE est-il un indicateur dans un champ de bits?

C’est un peu de décalage. (1 << 1) vaut 2 et (1 << 2) vaut 4 . (1 << 0) est égal à 1 , ce qui est plutôt ridicule, mais au moins, il est précalculé au moment de la compilation.