stringtranslate.com

cambio lógico

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 bits que se desplazará un valor dado, como desplazamiento a la izquierda en 1 o 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 determinado de posiciones de bits, y las posiciones de bits vacantes se llenan, generalmente con ceros y posiblemente unos (en contraste con un desplazamiento circular ).

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

Los cambios lógicos pueden resultar útiles como formas eficientes de realizar la multiplicación o división de números enteros sin signo por potencias de dos. Desplazar n bits hacia la izquierda en un número binario con o sin signo tiene el efecto de multiplicarlo por 2 n . Desplazar n bits hacia la derecha 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 tanto, muchos idiomas tienen diferentes operadores . 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 mediante lógica y aritmética tiene el mismo efecto).

Sin embargo, los lenguajes de programación C , C++ y Go 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 desplaza: los enteros con signo se desplazan mediante el desplazamiento aritmético y los enteros sin signo se desplazan mediante el desplazamiento lógico. En particular, C++ utiliza sus operadores de desplazamiento lógicos como parte de la sintaxis de sus funciones de entrada y salida, llamados "cin" y "cout" respectivamente.

Todos los estándares C actualmente relevantes (ISO/IEC 9899:1999 a 2011) dejan un vacío de definición para los casos en los que el número de desplazamientos es igual o mayor que el número de bits en los operandos de manera que el resultado no está definido. Esto ayuda a 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 bits o superior da 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 cambio en el 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 superiores 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 (23 decimal) se desplaza lógicamente una posición de bit, entonces:

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

Referencias

  1. ^ Manual de referencia de Ada comentado
  2. ^ https://ss64.com/nt/set.html
  3. ^ "Operadores bit a bit - Wiki de Python". wiki.python.org . Consultado el 24 de enero de 2018 .
  4. ^ "Shl en std::ops - Rust". doc.rust-lang.org . Consultado el 17 de enero de 2022 .
  5. ^ "Expresiones de operador: operadores binarios lógicos y aritméticos". doc.rust-lang.org . Consultado el 13 de noviembre de 2022 .
  6. ^ "Conjunto de instrucciones de PowerPC: slw". pds.twi.tudelft.nl . Consultado el 9 de abril de 2016 .
  7. ^ "Referencia del conjunto de instrucciones x86". x86.renejeschke.de . Consultado el 9 de abril de 2016 .
  8. ^ "Campo Opcodes.Shl". msdn.microsoft.com . Microsoft . Consultado el 9 de abril de 2016 .
  9. ^ "Manual de referencia del lenguaje LLVM - Instrucción shl". llvm.org . Proyecto LLVM . Consultado el 9 de abril de 2016 .
  10. ^ "<< Operador (referencia de C#)". msdn.microsoft.com . Microsoft . Consultado el 9 de abril de 2016 .