Les autres réponses expliquent l'idée d'opérateurs de bits, mais voici précisément ce qui se passe pour 100 >> 3
100
128 64 32 16 8 4 2 1
0 1 1 0 0 1 0 0 = 100
100 >> 1
128 64 32 16 8 4 2 1
0 0 1 1 0 0 1 0 = 50
100 >> 2
128 64 32 16 8 4 2 1
0 0 0 1 1 0 0 1 = 25
100 >> 3
128 64 32 16 8 4 2 1
0 0 0 0 1 1 0 0 = 12
Vous ne aurez pas besoin souvent de l'utiliser, à moins que vous avez besoin d'une division vraiment rapide par 2, mais même alors, ne l'utilisez pas. cela rend le code beaucoup plus compliqué que nécessaire, et la différence de vitesse est imperceptible.
La principale heure à laquelle vous devriez l'utiliser serait de travailler avec des données binaires, et vous devez spécifiquement déplacer les bits. La seule utilisation réelle que j'ai eu car il était en train de lire & écrire les tags ID3, qui stocke les informations de taille en octets 7 bits, comme ceci:
0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx.
qui devrait être mis en place comme ceci:
0000xxxx xxxxxxxx xxxxxxxx xxxxxxxx
pour donner un entier normal en mémoire.
Juste pour développer un peu, 100 est représenté en binaire comme 01100100, qui, lorsqu'il est décalé à droite 3 chiffres est 00001100, ce qui est 12. – StrixVaria
@Anon Merci. Il va sans dire que je ne sais pas grand-chose sur la façon dont le binaire est construit à partir de littéraux (ou vice versa), mais je suppose que ce n'est pas une coïncidence que '2 << x' semble fonctionnellement équivalent à' 2 ** x * 2 '. Pouvez-vous développer les mathématiques en cause? – orokusaki
Bien sûr. La première chose à noter est que le binaire est construit de la même façon que la décimale, nous utilisons simplement une base différente - donc au lieu des uns, des dizaines, des centaines, des milliers, nous utilisons les uns, les deux, les quatre, etc. Déplacer les bits vers la gauche * apparaît * fonctionnellement équivalent à la multiplication par deux de la même manière que virer un zéro à la fin d'un nombre de base 10 * semble * fonctionnellement équivalent à la multiplication par 10. –