Diferencia entre revisiones de «bitshift right»

De ArduWiki
Saltar a: navegación, buscar
(Ejemplo 3)
(Ejemplo 3)
Línea 42: Línea 42:
  
 
<syntaxhighlight lang="c++">
 
<syntaxhighlight lang="c++">
#include <EEPROM.h>
 
 
void setup(){
 
void setup(){
 +
  Serial.begin(9600);
 +
  //Leer
 +
  int val0,dato = 12345;
 +
  byte val1 = highByte(dato);  //Toma mas significativo
 +
  byte val2 = lowByte(dato);  //Toma menos significativo
 
   //Escribir
 
   //Escribir
   int dato = 12345;
+
   val0 = val1;                 //Escribe MSB
  EEPROM.write(0, highByte(dato));  //Toma mas significativo
+
   val0 = val0 << 8;           //Desplaza a la izquierda
  EEPROM.write(1, lowByte(dato));  //Toma menos significativo
+
   val0 |= val2;                //Lo mismo que: val0 += val2;
   //Leer
+
  Serial.println(val0);
  int val = EEPROM.read(0);
 
  val = val << 8;                   //Desplaza a la izquierda
 
   val += EEPROM.read(1);
 
 
}
 
}
  
 
void loop(){
 
void loop(){
 
   //Nada
 
   //Nada
}
+
}</syntaxhighlight>
</syntaxhighlight>
 
  
 
== Ejemplo 4 ==
 
== Ejemplo 4 ==

Revisión del 23:10 4 may 2019

Descripción

Desplaza hacia la derecha (hacia el bit menos significativo) una cantidad determinada de bits de una variable o constante; rellenando con ceros.

Sintaxis

valor >> posiciones;
valor >>= posiciones;

Parámetros

valor
Constante o variable a trabajar. Tipo int o long.
posiciones
Cantidad de posiciones a desplazar. Entre 1~32. Tipo int.

Retorno

Retorna el numero numero luego del desplazamiento.

Advertencias

  • Esta operación desplaza bits descartando los que hayan quedado fuera, no los rota de posición. Por lo tanto, desplazar la cantidad suficiente de bits puede resultar en un valor cero.

Ejemplo 1

int a = 0000000000101000;  //40
int b = a >> 3  //B0000000000000101 osea 5

int x = B1111111111110000;  //-16
int y = B0000000000000011;  //3
int result = x >> y;  //B1111111111111110

Ejemplo 2

Sirve para realizar una división entera con un cociente potencia de base 2

analogWrite(pin, analogRead(A0) >> 2);
// Mucho más rápido que map() o una división.

analogRead(A0) >> 2 equivale a analogRead(A0) / 4

Ejemplo 3

Leer y escribir un dato tipo int osea dos bytes.

void setup(){
   Serial.begin(9600);
   //Leer
   int val0,dato = 12345;
   byte val1 = highByte(dato);  //Toma mas significativo
   byte val2 = lowByte(dato);   //Toma menos significativo
   //Escribir
   val0 = val1;                 //Escribe MSB
   val0 = val0 << 8;            //Desplaza a la izquierda
   val0 |= val2;                //Lo mismo que: val0 += val2;
   Serial.println(val0);
}

void loop(){
   //Nada
}

Ejemplo 4

Leer y escribir un dato tipo long osea cuatro bytes.

#include <EEPROM.h>

void setup(){
   //Escribir
   long dato = 123456789;
   for (int i=0; i<4; i++) {
      EEPROM.write(3-i, lowByte(dato));
      dato = dato >> 8;      //Desplaza 8 bits a la derecha
   }
   //Lee
   long val = 0;
   for (int i=0; i<3; i++) {
      val += EEPROM.read(i);
      val = val << 8;       //Desplaza 8 bits a la izquierda
   }
   val += EEPROM.read(3);
}

void loop(){
   //Nada
}

Vea también

Referencias