tirabuzon robotica regla para mano izquierda generadores electromagnetismo ejemplos derecha bit-manipulation bitwise-operators bit-shift

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 a 2^4 es decir, 16)
  • Escribir un código más legible cuando se trabaja con bits. Por ejemplo, definir constantes usando 1 << 4 o 1 << 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