web-dev-qa-db-fra.com

Que fait un décalage binaire (gauche ou droite) et à quoi sert-il?

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?

63
The.Anti.9

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.

47
user unknown

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.

35
Nitish

Décalage à gauche

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

Décalage droit

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

24
loyola

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
14
Raghu

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.

3
Shobhit Raj

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);
3
Pabitra Dash

Quelques exemples:

  • Opérations sur les bits, par exemple, conversion vers et à partir de base64 (soit 6 bits au lieu de 8)
  • faire la puissance de 2 opérations (1 << 4 égal à 2^4 c'est-à-dire 16)
  • Écrire du code plus lisible lorsque vous travaillez avec des bits. Par exemple, définir des constantes à l'aide de 1 << 4 ou 1 << 5 est plus lisible.
2
Aliostad

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

2
user4463890

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();
}
0
R.M.VIVEK Arni