Operadores de desplazamiento de bit

Hay dos operadores de desplazamiento a nivel de bit.

<<  desplazamiento a la izquierda

>>  desplazamiento a la derecha

Son los mismos símbolos que utilizamos con cout y cin (para entrada y salida de datos) No confundir con ellos.


El operador de desplazamiento de bit a la derecha, como su nombre indica desplaza tantos bits como se le indique

      00000100 << 2   //Desplaza 2 bits a la derecha
      
Daría como resultado:
      00010000

Este operador rellena por la derecha con ceros tantas posiciones como se le indique.



El operador de desplazamiento de bit a la izquierda, desplaza tantos bit como se le indique

      00000100 >> 2 //Desplaza 2 bits a la izquierda

Daría como resultado:

      00000001

Si el Lvalue no tiene signo, este operador rellena por la izquierda con ceros tantas posiciones como se indique. Si el numero de bits a desplazar es mayor que el número de bit del Lvalue, producirá un valor indefinido.


Podemos utilizar la asignación contraída en ambos casos.

      a <<= n;     /* sería lo  mismo que */  a = a << n;
      a >>= n;     /* sería lo mismo que  */  a = a >> n;


Eje.-

//Desplazamiento de bit a la derecha
//Sólo válido para enteros positivos de, no mas de 16 bits
//Archivo: main.cpp

#include <iostream>
#include "binario.h"

using namespace std;


int main(void)
{
    int var;
    Binario b;
    cout<<"Introduce un valor entero positivo"<<endl;
    cin>>var;
    b.convertir(var);
    b.mostrarBinario();

    var <<= 2; //Se desplazan dos bit a la izquierda
    b.convertir(var);
    b.mostrarBinario();
    cout<<"Valor actual de var "<<var<<endl;
    return 0;

}

// ----------- CLASE BINARIO -----------
//Archivo: binario.h
#ifndef BINARIO_H
#define BINARIO_H
class Binario
{
private:
    int contador = 0;
    short int bina[15];
public:
    Binario();   //Constructor de clase
    void convertir(int);
    void mostrarBinario(void);
};

#endif // BINARIO_H
//Archivo: binario.cpp
#include "binario.h"
#include <iostream>
Binario::Binario()
{
    for(int i=0; i<16; i++)
        bina[i] = 0; //se inicializa a 0
    contador = 0;
}
void Binario::convertir(int var)
{
    for(int i=0; i<16; i++)
        bina[i] = 0; //se inicializa a 0
    contador = 0;
    while(contador < 16){
        bina[contador]=var % 2;
        var /= 2;
        contador++;
    }
}
void Binario::mostrarBinario(void)
{
    for(int i=15; i>=0;i--)
    {
        std::cout<<bina[i];
    }
    std::cout<<std::endl;
}