J'ai vu les opérateurs >>
et <<
dans divers codes que j’ai examinés (dont j’ai compris tout le sens), mais je me demande simplement ce qu’ils font et quelles sont leurs utilisations pratiques.
EDIT
Si les changements sont comme x * 2
et x / 2
, quelle est la vraie différence par rapport à l'utilisation de la *
et /
les opérateurs? Y a-t-il une différence de performance?
Voici un applet où vous pouvez exercer certaines opérations de bits, y compris le décalage.
Vous avez une collection de bits et vous en déplacez certains au-delà de leurs limites:
1111 1110 << 2
1111 1000
il est rempli de la droite avec des zéros frais. :)
0001 1111 >> 3
0000 0011
rempli de gauche. Le premier cas est un cas particulier. Il indique souvent une valeur négative - en fonction de la langue et du type de données. Il est si souvent souhaité que, si vous changez de cap, le premier bit reste tel quel.
1100 1100 >> 1
1110 0110
et il est conservé sur plusieurs quarts de travail:
1100 1100 >> 2
1111 0011
Si vous ne voulez pas que le premier bit soit préservé, vous utilisez (en Java, Scala, C++, Cafik et peut-être davantage) un opérateur à triple signe:
1100 1100 >>> 1
0110 0110
Il n’ya pas d’équivalent dans l’autre direction parce que cela n’a aucun sens - peut-être dans votre contexte très particulier, mais pas en général.
Mathématiquement, un décalage à gauche est un * = 2, 2 décalages à gauche est un * = 4 et ainsi de suite. Un décalage à droite est un/= 2 et ainsi de suite.
Décalage du bit gauche pour multiplier par une puissance de deux et décalage du bit droit pour diviser par une puissance de deux. Par exemple x = x * 2;
peut aussi être écrit comme x<<1
ou x = x*8
peut être écrit comme x<<3
(puisque 2, la puissance de 3 est 8). De même x = x / 2;
est x>>1
etc.
x = x * 2^value
(fonctionnement normal)
x << value
(opération binaire)
x = x * 16
(qui est identique à 2^4
)
L'équivalent de décalage à gauche serait x = x << 4
x = x / 2^value
(opération arithmétique normale)
x >> value
(opération binaire)
x = x / 8
(qui est identique à 2^3
)
L'équivalent de décalage à droite serait x = x >> 3
décalage gauche: Il est égal au produit de la valeur qui doit être décalé et de 2 élevé à la puissance du nombre de bits à décaler.
Exemple :
1<<3
0000 0001 ---> 1
Shift by 1 bit
0000 0010 ----> 2 which is equal to 1*2^1
Shift By 2 bits
0000 0100 ----> 4 which is equal to 1*2^2
Shift by 3 bits
0000 1000 ----> 8 which is equal to 1*2^3
décalage vers la droite: il est égal au quotient de la valeur qui doit être décalé de 2 et élevé à la puissance du nombre de bits à déplacer.
Exemple :
8>>3
0000 1000 ---> 8 which is equal to 8/2^0
Shift by 1 bit
0000 0100 ----> 4 which is equal to 8/2^1
Shift By 2 bits
0000 0010 ----> 2 which is equal to 8/2^2
Shift by 3 bits
0000 0001 ----> 1 which is equal to 8/2^3
Les opérateurs de décalage de bits sont plus efficaces que/ou *. Dans l'architecture informatique, diviser (/) ou multiplier (*) prend plus d'une unité de temps et s'enregistre pour calculer le résultat, tandis que, opérateur de décalage de bits, ne représente qu'un registre et un calcul d'unité de temps.
Le bit gauche se décale pour se multiplier par une puissance de deux. Changement de bit à droite pour diviser par une puissance de deux.
x = x << 5; // Left shift
y = y >> 5; // Right shift
En C/C++, il peut être écrit en tant que,
#include <math.h>
x = x * pow(2, 5);
y = y / pow(2, 5);
Quelques exemples:
1 << 4
égal à 2^4
c'est-à-dire 16)1 << 4
ou 1 << 5
est plus lisible.Oui, je pense que, du point de vue des performances, vous pourriez trouver une différence puisque les opérations de décalage gauche et droite au niveau du bit peuvent être effectuées avec une complexité de o(1) avec un jeu de données énorme.
Par exemple, puissance de calcul de 2 ^ n: -
int value = 1;
while (exponent<n)
{
//print out current power of 2
value =value *2; // equivalent machine level left shift bit wise operation
exponent++;
}
}
Un code similaire avec une opération de décalage gauche au niveau du bit ressemblerait à ceci:
value = 1 << n;
De plus, effectuer une opération binaire est comme une réplique exacte d'opérations mathématiques au niveau utilisateur (qui sont les instructions finales au niveau de la machine traitées par le microcontrôleur et le processeur).
Voici un exemple:
#include"stdio.h"
#include"conio.h"
void main()
{
int rm,vivek;
clrscr();
printf("enter the any numbers\t(e.g)1,2,5");
scanf("%d",&rm);//rm=5(0101)<<2(two step add zero's)so,value is 10100
printf("this lift shitf value%d=%d",rm,rm<<4);
printf("this right shitf value%d=%d",rm,rm>>2);
getch();
}