bit-manipulation - robotica - regla de la mano izquierda
¿Qué hace un cambio a nivel de bit(izquierda o derecha) y para qué se utiliza? (9)
He visto los operadores >>
y <<
en varios códigos que he visto (ninguno de los cuales realmente entendí), pero me pregunto qué hacen realmente y cuáles son algunos usos prácticos de ellos.
EDITAR
Si los cambios son como x * 2
y x / 2
, ¿cuál es la diferencia real de usar realmente los operadores *
y /
? ¿Hay una diferencia de rendimiento?
Shift izquierdo
x = x * 2^value
(operación normal)
x << value
(operación de bits)
x = x * 16
(que es lo mismo que 2^4
)
El equivalente del desplazamiento a la izquierda sería x = x << 4
Giro a la derecha
x = x / 2^value
(operación aritmética normal)
x >> value
(operación bit a bit)
x = x / 8
(que es lo mismo que 2^3
)
El equivalente de cambio a la derecha sería x = x >> 3
Algunos ejemplos:
- Operaciones de bits, por ejemplo, conversión hacia y desde base64 (que son 6 bits en lugar de 8)
- haciendo potencia de 2 operaciones (
1 << 4
igual a2^4
es decir, 16) - Escribir un código más legible cuando se trabaja con bits. Por ejemplo, definir constantes usando
1 << 4
o1 << 5
es más legible.
Aquí hay un applet donde puedes ejercitar algunas operaciones de bits, incluido el cambio.
Tiene una colección de bits y mueve algunos de ellos más allá de sus límites:
1111 1110 << 2
1111 1000
se llena desde la derecha con ceros recientes. :)
0001 1111 >> 3
0000 0011
lleno desde la izquierda Un caso especial es el líder 1. A menudo indica un valor negativo, según el idioma y el tipo de datos. Muy a menudo se quiere que, si cambias a la derecha, el primer bit permanezca como está.
1100 1100 >> 1
1110 0110
y se conserva en varios turnos:
1100 1100 >> 2
1111 0011
Si no desea conservar el primer bit, use (en Java, Scala, C ++, C afaik y tal vez más) un operador de signo triple:
1100 1100 >>> 1
0110 0110
No hay un equivalente en la otra dirección, porque no tiene sentido, tal vez en su contexto muy especial, pero no en general.
Matemáticamente, un desplazamiento a la izquierda es a * = 2, 2 cambios a la izquierda es a * = 4 y así sucesivamente. Un desplazamiento a la derecha es a / = 2 y así sucesivamente.
Aquí hay un ejemplo:
#include"stdio.h"
#include"conio.h"
void main()
{
int rm,vivek;
clrscr();
printf("enter the any numbers/t(e.g)1,2,5");
scanf("%d",&rm);//rm=5(0101)<<2(two step add zero''s)so,value is 10100
printf("this lift shitf value%d=%d",rm,rm<<4);
printf("this right shitf value%d=%d",rm,rm>>2);
getch();
}
El bit izquierdo cambia para multiplicarse por cualquier potencia de dos y el bit derecho cambia para dividirse por cualquier potencia de dos. Por ejemplo x = x * 2;
también se puede escribir como x<<1
o x = x*8
se puede escribir como x<<3
(desde 2 a la potencia de 3 es 8). Del mismo modo x = x / 2;
es x>>1
y así sucesivamente.
El bit izquierdo cambia para multiplicarse por cualquier potencia de dos. El bit derecho cambia para dividirse por cualquier potencia de dos.
x = x << 5; // Left shift
y = y >> 5; // Right shift
En C / C ++ se puede escribir como,
#include <math.h>
x = x * pow(2, 5);
y = y / pow(2, 5);
Los operadores de cambio de bit son más eficientes en comparación con el operador / o *. En la arquitectura de la computadora, divida (/) o multiplique (*) tome más de 1 unidad de tiempo y regístrese para calcular el resultado, mientras que el operador de cambio de bit es solo un registro y un cómputo de unidad de tiempo.
Sí, creo que en lo que respecta al rendimiento, puede encontrar una diferencia ya que las operaciones de desplazamiento a la izquierda y a la derecha en modo bit pueden realizarse con una complejidad de o (1) con un gran conjunto de datos.
Por ejemplo, Cálculo de potencia de 2 ^ n: -
int value = 1;
while (exponent<n)
{
//print out current power of 2
value =value *2; // equivalent machine level left shift bit wise operation
exponent++;
}
}
Código similar con operación de desplazamiento a la izquierda bit a bit sería como:
value = 1 << n;
Además, realizar una operación de bits es una réplica exacta de las operaciones matemáticas a nivel de usuario (que son las instrucciones finales a nivel de máquina procesadas por el microcontrolador y el procesador).
Cambio a la izquierda : es igual al producto de valor que tiene que ser desplazado y 2 elevado a la potencia del Número de bits que se va a desplazar.
Ejemplo:
1<<3
0000 0001 ---> 1
Shift by 1 bit
0000 0010 ----> 2 which is equal to 1*2^1
Shift By 2 bits
0000 0100 ----> 4 which is equal to 1*2^2
Shift by 3 bits
0000 1000 ----> 8 which is equal to 1*2^3
Desplazamiento a la derecha : Es igual al cociente de valor que tiene que desplazarse en 2 elevado a la potencia del Número de bits que se va a desplazar.
Ejemplo:
8>>3
0000 1000 ---> 8 which is equal to 8/2^0
Shift by 1 bit
0000 0100 ----> 4 which is equal to 8/2^1
Shift By 2 bits
0000 0010 ----> 2 which is equal to 8/2^2
Shift by 3 bits
0000 0001 ----> 1 which is equal to 8/2^3