Diferencia entre revisiones de «bitshift right»
De ArduWiki
(→Vea también) |
|||
(No se muestran 35 ediciones intermedias del mismo usuario) | |||
Línea 4: | Línea 4: | ||
== Sintaxis == | == Sintaxis == | ||
<pre> | <pre> | ||
− | valor = | + | valor <nowiki>>></nowiki> posiciones; |
− | + | variable = variable <nowiki>>></nowiki> posiciones; | |
+ | variable <nowiki>>>=</nowiki> posiciones; | ||
</pre> | </pre> | ||
− | ; | + | |
− | ; | + | == 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 == | ||
+ | {| 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 == | ||
* 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. | * 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 == | + | == Ejemplo 1 == |
+ | <syntaxhighlight lang="c++"> | ||
+ | int a = 0000000000101000; //40 | ||
+ | int b = a >> 3 //B0000000000000101 osea 5 | ||
+ | |||
+ | int x = B1111111111110000; //-16 | ||
+ | int y = B0000000000000011; //3 | ||
+ | int result = x >> y; //B1111111111111110 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == 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 | ||
− | < | + | |
+ | <syntaxhighlight lang="c++"> | ||
analogWrite(pin, analogRead(A0) >> 2); | analogWrite(pin, analogRead(A0) >> 2); | ||
// Mucho más rápido que map() o una división. | // Mucho más rápido que map() o una división. | ||
− | </ | + | </syntaxhighlight> |
+ | |||
'''analogRead(A0) >> 2''' equivale a '''analogRead(A0) / 4''' | '''analogRead(A0) >> 2''' equivale a '''analogRead(A0) / 4''' | ||
+ | |||
+ | == Ejemplo 4 == | ||
+ | Leer y escribir un dato tipo [[int]] osea dos bytes. | ||
+ | |||
+ | <syntaxhighlight lang="c++"> | ||
+ | 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 | ||
+ | }</syntaxhighlight> | ||
+ | |||
+ | == Ejemplo 5 == | ||
+ | Descomponer y reconstruir un dato tipo [[long]] osea cuatro bytes. | ||
+ | |||
+ | <syntaxhighlight lang="c++"> | ||
+ | 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 | ||
+ | } | ||
+ | </syntaxhighlight> | ||
== Vea también == | == Vea también == | ||
− | * [[not]] | + | * [[not bit a bit]] - (<nowiki>~</nowiki>) |
− | * [[and]] | + | * [[and bit a bit]] - (<nowiki>&</nowiki>) |
− | * [[or]] | + | * [[or bit a bit]] - (<nowiki>|</nowiki>) |
− | * [[bitshift left]] | + | * [[xor bit a bit]] - (<nowiki>^</nowiki>) |
+ | * [[bitshift left]] - (<nowiki><<</nowiki>) | ||
+ | * [[or bit a bit compuesto]] <nowiki>(|=)</nowiki> | ||
+ | * [[and bit a bit compuesto]] <nowiki>(&=)</nowiki> | ||
+ | <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: | + | [[Category:Operador bit a bit]] |
Revisión actual del 16:27 26 sep 2019
Contenido
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
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
- not bit a bit - (~)
- and bit a bit - (&)
- or bit a bit - (|)
- xor bit a bit - (^)
- bitshift left - (<<)
- or bit a bit compuesto (|=)
- and bit a bit compuesto (&=)