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 que se desplazará un valor dado, como desplazar a la izquierda 1 o desplazar a la derecha 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 su mantisa ; cada bit del operando simplemente se mueve un número determinado de posiciones de bit, y las posiciones de bit vacías se rellenan, generalmente con ceros, y posiblemente con unos (a diferencia de un desplazamiento circular ).
El desplazamiento lógico se utiliza a menudo cuando su operando se trata como una secuencia de bits en lugar de como un número.
Los desplazamientos lógicos pueden ser útiles como métodos eficientes para realizar la multiplicación o división de enteros sin signo por potencias de dos. Desplazar n bits a la izquierda en un número binario con o sin signo tiene el efecto de multiplicarlo por 2ⁿ . Desplazar n bits a la derecha en un número binario sin signo tiene el efecto de dividirlo por 2ⁿ ( redondeando hacia 0).
El desplazamiento lógico a la derecha difiere del desplazamiento aritmético a la derecha. Por lo tanto, muchos lenguajes tienen operadores distintos para cada uno. Por ejemplo, en Java y JavaScript , el operador de desplazamiento lógico a la derecha es >>> , mientras que el operador de desplazamiento aritmético a la derecha es >> . (Java solo tiene un operador de desplazamiento a la izquierda ( << ), ya que el desplazamiento a la izquierda mediante lógica y aritmética tiene 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++, así como 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 mediante el desplazamiento lógico. En particular, C++ utiliza sus operadores de desplazamiento lógico como parte de la sintaxis de sus funciones de entrada y salida, llamadas "cin" y "cout" respectivamente.
Todos los estándares C relevantes actualmente (ISO/IEC 9899:1999 a 2011) dejan un vacío de definición para los casos en que el número de desplazamientos es igual o mayor que el número de bits en los operandos, de manera que el resultado es indefinido. Esto ayuda a que los compiladores C generen código eficiente para diversas plataformas al permitir el uso directo de las instrucciones de desplazamiento nativas, que tienen comportamientos diferentes. Por ejemplo, shift-left-word en PowerPC elige el comportamiento más intuitivo donde un desplazamiento del ancho de bits o superior da como resultado cero, [ 6 ] 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 desplazamiento del ancho de bits no cambia el valor. [ 7 ]
Algunos lenguajes, como .NET Framework y LLVM , también dejan el desplazamiento por ancho de bits y superior sin especificar (.NET) [ 8 ] o sin definir (LLVM). [ 9 ] Otros optan por especificar el comportamiento de sus plataformas de destino más comunes, como C# , que especifica el comportamiento x86. [ 10 ]
Ejemplo
Si la secuencia de bits 0001 0111 (decimal 23) se desplaza lógicamente una posición de bit, entonces:
Nota: MSB = Bit más significativo, LSB = Bit menos significativo
Referencias
- ↑ "Las interfaces de paquetes" . www.adaic.org .
- ↑ "Establecer - Variable de entorno - Windows CMD - SS64.com" . ss64.com .
- ↑ "Operadores bit a bit - Wiki de Python" . wiki.python.org . Consultado el 24 de enero de 2018 .
- ↑ "Shl en std::ops - Rust" . doc.rust-lang.org . Consultado el 17 de enero de 2022 .
- ↑ "Expresiones de operadores: operadores binarios aritméticos y lógicos" . doc.rust-lang.org . Consultado el 13 de noviembre de 2022 .
- ↑ "Conjunto de instrucciones PowerPC: slw" . pds.twi.tudelft.nl . Archivado del original el 4 de septiembre de 2014. Consultado el 9 de abril de 2016 .
- ↑ "Referencia del conjunto de instrucciones x86" . x86.renejeschke.de . Archivado del original el 19 de febrero de 2018. Consultado el 9 de abril de 2016 .
- ↑ "Campo Opcodes.Shl" . msdn.microsoft.com . Microsoft . Consultado el 9 de abril de 2016 .
- ↑ "Manual de referencia del lenguaje LLVM - Instrucciones shl" . llvm.org . Proyecto LLVM . Consultado el 9 de abril de 2016 .
- ↑ "<< Operador (Referencia de C#)" . msdn.microsoft.com . Microsoft . Consultado el 9 de abril de 2016 .
- Aritmética binaria
- Operadores (programación)