Idioma o procesador | Izquierda | Derecha |
---|---|---|
Ada [1] | Shift_Left | Shift_Right |
Lote , [2] C , C ++ , Go , Swift (solo tipos sin firmar); ML estándar , Verilog , PHP , Python [3] | << | >> |
D , Java , JavaScript , Julia | << | >>> |
F # (solo tipos sin firmar) | <<< | >>> |
Fortran | LSHIFT | RSHIFT |
OCaml | lsl | lsr |
Objeto Pascal , Delphi , ensamblado x86 , Kotlin , Powershell | shl | Shr |
Lenguaje de descripción de hardware VHSIC ( VHDL ), MIPS | sll | srl |
PowerPC | slw | srw |
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:
Rendimiento de desplazamiento a la izquierda: 0010 1110 (decimal 46) | Rendimiento de desplazamiento a la derecha: 0000 1011 (11 decimal) |
Nota: MSB = bit más significativo, LSB = bit menos significativo
Referencias
- ^ Manual de referencia de Ada anotado
- ^ https://ss64.com/nt/set.html
- ^ "BitwiseOperators - Python Wiki" . wiki.python.org . Consultado el 24 de enero de 2018 .
- ^ "Conjunto de instrucciones PowerPC: slw" . pds.twi.tudelft.nl . Consultado el 9 de abril de 2016 .
- ^ "Referencia del conjunto de instrucciones x86" . x86.renejeschke.de . 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 - Instrucción 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 .