2010-02-22 4 views

Répondre

13

Décalage à droite est pas division

Regardons ce right-shiftfait fait, et il deviendra clair. Tout d'abord, rappelez qu'un nombre est stocké dans la mémoire sous forme de collection de chiffres binaires. Si nous avons 8 bits de mémoire, nous pouvons stocker 2 comme 00000010 et 5 comme 00000101.

Le décalage vers la droite prend ces chiffres et les déplace vers la droite. Par exemple, le décalage à droite de nos deux chiffres ci-dessus donnera respectivement 00000001 et 00000010.

Notez que le chiffre le plus bas (right -most) est décalé complètement de la fin et n'a aucun effet sur le résultat final.

+2

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

+0

@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

+2

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

4

>> et << sont respectivement les opérateurs bit shift droit et gauche. Vous devriez regarder la représentation binaire des nombres.

>>> bin(100) 
'0b1100100' 
>>> bin(12) 
'0b1100' 
1

Le décalage d'un entier donne un autre nombre entier. Par exemple, le nombre 12 est écrit en binaire comme 0b1100. Si nous décalons de 1 vers la droite, nous obtenons 0b110 = 6. Si nous changeons de bit 2, nous obtenons 0b11 = 3. Enfin, si nous effectuons un décalage binaire de 3, nous obtenons 0b1 = 1 plutôt que 1,5. C'est parce que les bits qui sont décalés au-delà du registre sont perdus. Un moyen facile d'y penser est le déplacement de bits vers la droite par N, c'est la même chose que de diviser par 2^N, puis de tronquer le résultat.

2

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.

Questions connexes