Saltar al contenido

La diferencia entre desplazamiento lógico a la derecha, desplazamiento aritmético a la derecha y rotación a la derecha

Nuestros mejores programadores han agotado sus provisiones de café, investigando a tiempo completo por la respuesta, hasta que Claudia encontró la respuesta en Gogs así que hoy la compartimos con nosotros.

Solución:

Primero recuerda que las palabras de máquina tienen un tamaño fijo. Di 4, y que tu entrada sea:

+---+---+---+---+
| a | b | c | d |
+---+---+---+---+

Luego empujando todo una posición a la izquierda da:

+---+---+---+---+
| b | c | d | X |
+---+---+---+---+

Pregunta qué poner como X?

  1. con un cambio poner 0
  2. con girar poner a

Ahora empuje todo una posición a la derecha da:

+---+---+---+---+
| X | a | b | c |
+---+---+---+---+

Pregunta qué poner como X?

  1. con un cambio lógico poner 0
  2. con un cambio aritmético poner a
  3. con girar poner d

Apenas.

cambio lógico corresponden a (desplazamiento a la izquierda) multiplicación por 2, (desplazamiento a la derecha) división de enteros por 2.

cambio aritmético es algo relacionado con la representación en complemento a 2 de números con signo. En esta representación, el signo es el bit más a la izquierda, luego el cambio aritmético conserva el signo (esto se llama extensión de signo).

Girar no tiene un significado matemático ordinario y es casi una operación obsoleta incluso en las computadoras.

La diferencia se explica bastante en la columna de la derecha.

  • El desplazamiento lógico trata el número como un conjunto de bits y se desplaza en ceros. Este es el >> operador en c
  • El cambio aritmético trata el número como un entero con signo (en complemento de 2) y “retiene” el bit superior, cambiando a ceros si el bit superior era 0 y a unos si era uno. El operador de desplazamiento a la derecha de C tiene un comportamiento definido por la implementación si el número que se desplaza es negativo.

    Por ejemplo, el número binario 11100101 (-27 en decimal, suponiendo complemento a 2), cuando se desplazan 3 bits a la derecha utilizando el desplazamiento lógico, se convierte en 00011100 (28 decimales). Esto es claramente confuso. Usando un cambio aritmético, el bit de signo se mantendría y el resultado sería 11111100 (decimal -4, que es más o menos correcto para -27/8).

  • La rotación tampoco lo hace, ya que los bits superiores se reemplazan por los inferiores. C no tiene un operador para hacer la rotación.

Recuerda que puedes difundir esta reseña si te valió la pena.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *