Operadores de desplazamiento a la izquierda y desplazamiento a la derecha en C/C++

Shift izquierdo :

Denotado como: << 

Ej.: N<<i (N: primer operando, i: segundo operando)

Toma dos números, desplaza a la izquierda los bits del primer operando, el segundo operando decide el número de lugares a desplazar. O, en otras palabras, desplazar a la izquierda un número entero “ x ” con un número entero “ y ” denotado como ‘ (x<<y)’ es equivalente a multiplicar x por 2^y (2 elevado a la potencia y). 

por ejemplo: tomemos N=22 ; que es 00010110 en forma binaria.

      Ahora, si » N se desplaza a la izquierda por 2 «, es decir , N=N<<2 , entonces N se convertirá en N=N*(2^2) . Por lo tanto, N=22*(2^2)=88 que se puede escribir como 01011000.

C

/* C++ Program to demonstrate use of left shift 
   operator */
#include<stdio.h>
int main()
{
    // a = 5(00000101), b = 9(00001001)
    unsigned char a = 5, b = 9; 
  
    // The result is 00001010 
    printf("a<<1 = %d\n", a<<1);
    
    // The result is 00010010 
    printf("b<<1 = %d\n", b<<1);  
    return 0;
}

C++

/* C++ Program to demonstrate use of left shift 
   operator */
#include <iostream>
using namespace std;
  
int main()
{
    // a = 5(00000101), b = 9(00001001)
    unsigned char a = 5, b = 9; 
  
    // The result is 00001010 
    cout <<"a<<1 = "<< (a<<1) << endl;
    
    // The result is 00010010 
    cout <<"b<<1 = "<< (b<<1) << endl;  
    return 0;
}
  
// This code is contributed by shivanisinghss2110
Producción

a<<1 = 10
b<<1 = 18

Giro a la derecha :

Denotado como: >>

Ej: N>>i (N: primer operando, i: segundo operando)

Toma dos números, desplaza a la derecha los bits del primer operando, el segundo operando decide el número de lugares a desplazar. En otras palabras, desplazar a la derecha un entero “ x ” con un entero “ y ” denotado como ‘ (x>>y) ‘ es equivalente a dividir x entre 2^y. 

por ejemplo: tomemos N=32 ; que es 100000 en forma binaria.

     Ahora, si » N se desplaza a la derecha en 2 » , es decir, N=N>>2 , entonces N se convertirá en N=N/(2^2) . Por lo tanto, N=32/(2^2)=8 que se puede escribir como 1000 .
 

C++

/* C++ Program to demonstrate use of right
   shift operator */
#include <iostream>
using namespace std;
  
int main()
{
    // a = 5(00000101), b = 9(00001001)
    unsigned char a = 5, b = 9;
  
    // The result is 00000010
  
    cout <<"a>>1 = "<< (a >> 1)<< endl;
  
    // The result is 00000100
    cout <<"b>>1 = "<< (b >> 1) << endl;
    return 0;
}
  
// This code is contributed by shivanisinghss2110

C

/* C++ Program to demonstrate use of right
   shift operator */
#include <stdio.h>
  
using namespace std;
int main()
{
    // a = 5(00000101), b = 9(00001001)
    unsigned char a = 5, b = 9;
  
    // The result is 00000010
  
    printf("a>>1 = %d\n", a >> 1);
  
    // The result is 00000100
    printf("b>>1 = %d\n", b >> 1);
    return 0;
}
Producción

a>>1 = 2
b>>1 = 4

GeeksforGeeks-CPP-Foundation-Course

Puntos importantes : 

  • Los operadores de desplazamiento a la izquierda y desplazamiento a la derecha no deben usarse para números negativos. El resultado de es un comportamiento indefinido si alguno de los operandos es un número negativo. Por ejemplo, los resultados de 1 >> -1 y 1 << -1 no están definidos.
  • Si el número se desplaza más que el tamaño del entero, el comportamiento no está definido. Por ejemplo, 1 << 33 no está definido si los enteros se almacenan utilizando 32 bits. Para el desplazamiento de bits de valores más grandes, 1ULL<<62   ULL se usa para Unsigned Long Long, que se define usando 64 bits que pueden almacenar valores grandes.
  • El desplazamiento a la izquierda por 1 y el desplazamiento a la derecha por 1 son equivalentes al producto del primer término y 2 al elemento potencia dado (1<<3 = 1*pow(2,3)) y la división del primer término y el segundo término elevado a la potencia 2 (1>>3 = 1/pow(2,3)) respectivamente. 
    Como se mencionó en el punto 1, solo funciona si los números son positivos.

C++

#include <iostream>
using namespace std;
  
int main()
{
    int x = 19;
    unsigned long long y = 19;
    cout <<"x << 1 = " << (x << 1) << endl;
    cout <<"x >> 1 = " << (x >> 1) << endl;
    // shift y by 61 bits left
    cout <<"y << 61 = " << (y << 61) << endl;
    return 0;
}
  
// this code is contributed by shivanisinghss2110

C

#include <stdio.h>
int main()
{
    int x = 19;
    unsigned long long y = 19;
    printf("x << 1 = %d\n", x << 1);
    printf("x >> 1 = %d\n", x >> 1);
    // shift y by 61 bits left
    printf("y << 61 = %lld\n", y << 61);
    return 0;
}
Producción

x << 1 = 38
x >> 1 = 9
y << 61 = 6917529027641081856
  • El desplazamiento a la izquierda de 1 por i es equivalente a 2 elevado a la potencia i. 
    Como se mencionó en el punto 1, solo funciona si los números son positivos. 
     

C++

#include <iostream>
using namespace std;
  
int main()
{ 
   int i = 3;  
   cout <<"pow(2, "<< i << ") = " << (1 << i) << endl;
   i = 4;  
   cout <<"pow(2, "<< i << ") = " << (1 << i) << endl;
   return 0;
}
  
// this code is contributed by shivanisinghss2110

C

#include<stdio.h>
int main()
{ 
   int i = 3;  
   printf("pow(2, %d) = %d\n", i, 1 << i);
   i = 4;  
   printf("pow(2, %d) = %d\n", i, 1 << i);
   return 0;
}
Producción

pow(2, 3) = 8
pow(2, 4) = 16

Datos interesantes sobre los operadores bit a bit en C
 

Publicación traducida automáticamente

Artículo escrito por kartik y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *