Cambio lógico


De Wikipedia, la enciclopedia libre
Saltar a navegación Saltar a búsqueda


En informática , un desplazamiento lógico es una operación bit a bit que desplaza todos los bits de su operando. Las dos variantes básicas son el desplazamiento lógico a la izquierda y el desplazamiento lógico a la derecha . Esto se modula aún más por el número de posiciones de bit en el que se desplazará un valor dado, como un desplazamiento a la izquierda en 1 o un desplazamiento a la derecha en n . A diferencia de un desplazamiento aritmético , un desplazamiento lógico no conserva el bit de signo de un número ni distingue el exponente de un número de su significado.(mantisa); cada bit en el operando simplemente se mueve un número dado de posiciones de bit, y las posiciones de bit vacantes se llenan, generalmente con ceros y posiblemente con unos (en contraste con un desplazamiento circular ).

Un desplazamiento lógico se usa a menudo cuando su operando se trata como una secuencia de bits en lugar de como un número.

Los cambios lógicos pueden ser útiles como formas eficientes de realizar la multiplicación o división de enteros sin signo por potencias de dos. El desplazamiento a la izquierda n bits en un número binario con signo o sin signo tiene el efecto de multiplicarlo por 2 n . El desplazamiento a la derecha n bits en un número binario sin signo tiene el efecto de dividirlo por 2 n (redondeando hacia 0).

El desplazamiento lógico a la derecha difiere del desplazamiento aritmético a la derecha. Por lo tanto, muchos idiomas tienen diferentes operadores para ellos. Por ejemplo, en Java y JavaScript , el operador lógico de desplazamiento a la derecha es >>> , pero el operador aritmético de desplazamiento a la derecha es >> . (Java tiene solo un operador de desplazamiento a la izquierda ( << ), porque el desplazamiento a la izquierda a través de la lógica y la aritmética tienen el mismo efecto).

Los lenguajes de programación C , C ++ y Go , sin embargo, solo tienen un operador de desplazamiento a la derecha, >> . La mayoría de las implementaciones de C y C ++, y Go, eligen qué desplazamiento a la derecha realizar según el tipo de entero que se está desplazando: los enteros con signo se desplazan mediante el desplazamiento aritmético y los enteros sin signo se desplazan mediante el desplazamiento lógico.

Todas las normas C actualmente relevantes (ISO / IEC 9899: 1999 a 2011) dejan un espacio de definición para los casos en los que el número de cambios es igual o mayor que el número de bits en los operandos de manera que el resultado no está definido. Esto ayuda a permitir que los compiladores de C emitan código eficiente para varias plataformas al permitir el uso directo de las instrucciones de cambio nativas que tienen un comportamiento diferente. Por ejemplo, shift-left-word en PowerPC elige el comportamiento más intuitivo donde el desplazamiento por el ancho de bit o superior da cero, [4] mientras que SHL en x86 elige enmascarar la cantidad de desplazamiento a los bits inferiores para reducir el tiempo máximo de ejecución. de las instrucciones y, como tal, un cambio por el ancho de bits no cambia el valor. [5]

Algunos lenguajes, como .NET Framework y LLVM , también dejan desplazamientos por el ancho de bits y por encima de los no especificados (.NET) [6] o indefinidos (LLVM). [7] Otros eligen especificar el comportamiento de sus plataformas de destino más comunes, como C # que especifica el comportamiento de x86. [8]

Ejemplo

Si la secuencia de bits 0001 0111 (decimal 23) se desplaza lógicamente en una posición de bit, entonces:

Nota: MSB = bit más significativo, LSB = bit menos significativo

Referencias

  1. ^ Manual de referencia de Ada anotado
  2. ^ https://ss64.com/nt/set.html
  3. ^ "BitwiseOperators - Python Wiki" . wiki.python.org . Consultado el 24 de enero de 2018 .
  4. ^ "Conjunto de instrucciones de PowerPC: slw" . pds.twi.tudelft.nl . Consultado el 9 de abril de 2016 .
  5. ^ "Referencia del conjunto de instrucciones x86" . x86.renejeschke.de . Consultado el 9 de abril de 2016 .
  6. ^ "Campo Opcodes.Shl" . msdn.microsoft.com . Microsoft . Consultado el 9 de abril de 2016 .
  7. ^ "Manual de referencia del lenguaje LLVM - instrucción shl" . llvm.org . Proyecto LLVM . Consultado el 9 de abril de 2016 .
  8. ^ "<< Operador (Referencia de C #)" . msdn.microsoft.com . Microsoft . Consultado el 9 de abril de 2016 .
Obtenido de " https://en.wikipedia.org/w/index.php?title=Logical_shift&oldid=1016534066 "