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?
- con un cambio poner 0
- con girar poner
a
Ahora empuje todo una posición a la derecha da:
+---+---+---+---+
| X | a | b | c |
+---+---+---+---+
Pregunta qué poner como X?
- con un cambio lógico poner 0
- con un cambio aritmético poner
a
- 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 en00011100
(28 decimales). Esto es claramente confuso. Usando un cambio aritmético, el bit de signo se mantendría y el resultado sería11111100
(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.