Diferencia entre revisiones de «bitshift right»

De ArduWiki
Saltar a: navegación, buscar
(Ejemplo 3)
(Vea también)
 
(No se muestran 26 ediciones intermedias del mismo usuario)
Línea 4: Línea 4:
 
== Sintaxis ==
 
== Sintaxis ==
 
<pre>
 
<pre>
valor >> posiciones;
+
valor <nowiki>>></nowiki> posiciones;
valor >>= posiciones;
+
variable = variable <nowiki>>></nowiki> posiciones;
 +
variable <nowiki>>>=</nowiki> posiciones;
 
</pre>
 
</pre>
  
 
== Parámetros ==
 
== Parámetros ==
;valor: Constante o variable a trabajar. Tipo [[int]] o [[long]].
+
;valore:Constante a trabajar. Tipo [[int]] o [[long]].
;posiciones: Cantidad de posiciones a desplazar. Entre 1~32. Tipo [[int]].
+
;variable:Variable a trabajar. Tipo [[int]] o [[long]].
 +
;posiciones:Cantidad de posiciones a desplazar. Entre 1~32. Tipo [[int]].
  
 
== Retorno ==
 
== Retorno ==
 
Retorna el numero numero luego del desplazamiento.
 
Retorna el numero numero luego del desplazamiento.
 +
 +
== Comentarios ==
 +
{| class="wikitable col1cen col2cen"
 +
|+Algunas operaciones básicas
 +
|-
 +
! Operación !! Resultado
 +
|-
 +
|1024 <nowiki>>></nowiki> 0||1024
 +
|-
 +
|1024 <nowiki>>></nowiki> 1||512
 +
|-
 +
|1024 <nowiki>>></nowiki> 2||256
 +
|-
 +
|1024 <nowiki>>></nowiki> 7||8
 +
|-
 +
|1024 <nowiki>>></nowiki> 8||4
 +
|-
 +
|1024 <nowiki>>></nowiki> 9||2
 +
|-
 +
|1024 <nowiki>>></nowiki> 10||1
 +
|}
 +
 +
{{Nota|Ver ejemplo 2}}
  
 
== Advertencias ==
 
== Advertencias ==
Línea 29: Línea 54:
  
 
== Ejemplo 2 ==
 
== Ejemplo 2 ==
 +
Demuestra el comentario.
 +
 +
<syntaxhighlight lang="c++">
 +
void setup(){
 +
  Serial.begin(9600);
 +
  for (byte i=0; i<=10; i++) {
 +
      Serial.println(1024 >> i);
 +
  }
 +
}
 +
 +
void loop(){
 +
  //Nada
 +
}
 +
</syntaxhighlight>
 +
 +
== Ejemplo 3 ==
 
Sirve para realizar una división entera con un cociente potencia de base 2
 
Sirve para realizar una división entera con un cociente potencia de base 2
  
Línea 38: Línea 79:
 
'''analogRead(A0) >> 2''' equivale a '''analogRead(A0) / 4'''
 
'''analogRead(A0) >> 2''' equivale a '''analogRead(A0) / 4'''
  
== Ejemplo 3 ==
+
== Ejemplo 4 ==
 
Leer y escribir un dato tipo [[int]] osea dos bytes.
 
Leer y escribir un dato tipo [[int]] osea dos bytes.
  
 
<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 5 ==
Leer y escribir un dato tipo [[long]] osea cuatro bytes.
+
Descomponer y reconstruir un dato tipo [[long]] osea cuatro bytes.
  
 
<syntaxhighlight lang="c++">
 
<syntaxhighlight lang="c++">
#include <EEPROM.h>
 
 
 
void setup(){
 
void setup(){
   //Escribir
+
    Serial.begin(9600);
   long dato = 123456789;
+
   //Descomponer
   for (int i=0; i<4; i++) {
+
   long dat1 = 123456789;
       EEPROM.write(3-i, lowByte(dato));
+
  Serial.println(dat1, HEX);
       dato = dato >> 8;      //Desplaza 8 bits a la derecha
+
  byte val[4];
 +
   for (byte i=0; i<4; i++) {
 +
       val[i] = lowByte(dat1));
 +
       dat1 = dat1 >> 8;      //Desplaza 8 bits a la derecha
 
   }
 
   }
   //Lee
+
   //Reconstruir
   long val = 0;
+
   long dat2;
   for (int i=0; i<3; i++) {
+
   for (i=0; i<4; i++) {
       val += EEPROM.read(i);
+
       dat2 += val[3-i];
      val = val << 8;      //Desplaza 8 bits a la izquierda
+
      if (i != 3){
 +
        dat2 = dat2 << 8;      //Desplaza 8 bits a la izquierda
 +
      }
 
   }
 
   }
   val += EEPROM.read(3);
+
   Serial.println(dat2, HEX);
 
}
 
}
  
Línea 87: Línea 131:
  
 
== Vea también ==
 
== Vea también ==
* [[not]] - (<nowiki>!</nowiki>)
 
* [[and]] - (<nowiki>&&</nowiki>)
 
* [[or]] - (<nowiki>||</nowiki>)
 
 
* [[not bit a bit]] - (<nowiki>~</nowiki>)
 
* [[not bit a bit]] - (<nowiki>~</nowiki>)
 
* [[and bit a bit]] - (<nowiki>&</nowiki>)
 
* [[and bit a bit]] - (<nowiki>&</nowiki>)
Línea 95: Línea 136:
 
* [[xor bit a bit]] - (<nowiki>^</nowiki>)
 
* [[xor bit a bit]] - (<nowiki>^</nowiki>)
 
* [[bitshift left]] - (<nowiki><<</nowiki>)
 
* [[bitshift left]] - (<nowiki><<</nowiki>)
* [[highByte()]]
+
* [[or bit a bit compuesto]] <nowiki>(|=)</nowiki>
* [[lowByte()]]
+
* [[and bit a bit compuesto]] <nowiki>(&=)</nowiki>
* [[EEPROM]]
+
<categorytree mode=all>Funciones bit y byte</categorytree>
  
== Referencias ==
+
== Referencias externas ==
 
* [https://www.arduino.cc/reference/es/language/functions/time/millis/ Guia de referencia de Arduino]
 
* [https://www.arduino.cc/reference/es/language/functions/time/millis/ Guia de referencia de Arduino]
  
[[Category:Estructura]]
+
[[Category:Operador bit a bit]]

Revisión actual del 12:27 26 sep 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;
variable = variable >> posiciones;
variable >>= posiciones;

Parámetros

valore
Constante a trabajar. Tipo int o long.
variable
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.

Comentarios

Algunas operaciones básicas
Operación Resultado
1024 >> 0 1024
1024 >> 1 512
1024 >> 2 256
1024 >> 7 8
1024 >> 8 4
1024 >> 9 2
1024 >> 10 1

Nota: Ver ejemplo 2


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

Demuestra el comentario.

void setup(){
   Serial.begin(9600);
   for (byte i=0; i<=10; i++) {
      Serial.println(1024 >> i);
   }
}

void loop(){
   //Nada
}

Ejemplo 3

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 4

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 5

Descomponer y reconstruir un dato tipo long osea cuatro bytes.

void setup(){
    Serial.begin(9600);
   //Descomponer
   long dat1 = 123456789;
   Serial.println(dat1, HEX);
   byte val[4];
   for (byte i=0; i<4; i++) {
      val[i] = lowByte(dat1));
      dat1 = dat1 >> 8;      //Desplaza 8 bits a la derecha
   }
   //Reconstruir
   long dat2;
   for (i=0; i<4; i++) {
      dat2 += val[3-i];
      if (i != 3){
         dat2 = dat2 << 8;       //Desplaza 8 bits a la izquierda
      }
   }
   Serial.println(dat2, HEX);
}

void loop(){
   //Nada
}

Vea también


Referencias externas