Operación de bits

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 16 de diciembre de 2021; las comprobaciones requieren 10 ediciones .

Una operación bit a bit en programación  es una operación en cadenas de bits , por regla general, las operaciones lógicas bit a bit y los cambios de bit se incluyen en esta clase . Se utilizan en lenguajes de programación y tecnología digital , se estudian en matemáticas discretas .

Las operaciones de bits son la base del procesamiento de señales digitales : por medio de ellas, se obtiene una nueva señal a partir de una o más señales en la entrada, que a su vez se puede alimentar a la entrada de una o más de tales operaciones. Son las operaciones de bits en combinación con elementos de almacenamiento (por ejemplo , disparadores ) las que realizan toda la riqueza de las posibilidades de la tecnología digital moderna.

Operaciones bit a bit

Varias fuentes en lenguajes de bajo nivel llaman a las operaciones lógicas bit a bit simplemente lógicas [1] [2] , pero en la terminología de programación en lenguajes de alto nivel, los nombres de las operaciones bit a bit contienen adjetivos bit a bit , bit a bit (por ejemplo: “ Y lógico bit a bit ”, también es “multiplicación bit a bit”), bit a bit .

En algunos lenguajes de programación, los nombres de los operadores correspondientes a operaciones lógicas y lógicas bit a bit son similares. Además, el lenguaje de programación puede permitir la conversión implícita de un tipo numérico a un tipo booleano y viceversa. En tales lenguajes de programación, se debe tener cuidado con el uso de operaciones lógicas y bit a bit, ya que la combinación de las mismas puede conducir a errores. Por ejemplo, en C++ , el resultado de la expresión "2 && 1" ( AND lógico ) es el valor booleano true , y el resultado de la expresión "2 & 1" ( AND bit a bit ) es el valor entero 0 .

Negación bit a bit

La negación bit a bit (o NOT bit a bit , complemento ) es una operación unaria cuya acción es equivalente a aplicar la negación lógica a cada bit de la representación binaria del operando. En otras palabras, en la posición donde había 0 en la representación binaria del operando, el resultado será 1 y, a la inversa, donde había 1, habrá 0. Por ejemplo:

NO 01
diez

Bit a bit Y

Bitwise "AND"  es una operación binaria , cuya acción es equivalente a aplicar un "AND" lógico a cada par de bits que están en las mismas posiciones en las representaciones binarias de los operandos. En otras palabras, si ambos bits correspondientes de los operandos son 1, el bit resultante es 1; si al menos un bit del par es 0, el bit resultante es 0.

Ejemplo:

Y 0011
0101
0001

Bit a bit O

Bitwise OR  es una operación binaria que equivale a aplicar un OR lógico a cada par de bits que tienen la misma posición en las representaciones binarias de los operandos. En otras palabras, si ambos bits correspondientes de los operandos son 0, el bit binario del resultado es 0; si al menos un bit del par es 1, el bit binario del resultado es 1.

Ejemplo:

O 0011
0101
0111

XOR bit a bit

El OR exclusivo bit a bit (suma módulo 2) es una operación binaria cuya acción equivale a aplicar un OR exclusivo lógico a cada par de bits que se encuentran en las mismas posiciones en las representaciones binarias de los operandos. En otras palabras, si ambos bits correspondientes de los operandos son iguales entre sí, el bit binario del resultado es 0; de lo contrario, el dígito binario del resultado es 1.

Ejemplo:

Excl. O 0011
0101
0110

El primer nombre ruso de la operación se debe al hecho de que el resultado de esta operación difiere del resultado de "O" solo en un caso de los 4 casos de entrada, ambos 1 (el caso de la verdad simultánea de los argumentos está "excluido "). Incluso en la gramática rusa, el significado de este conector lógico se transmite mediante la unión "o".

El segundo nombre es el que en realidad es adición en el anillo de residuos módulo dos, del que se siguen algunas propiedades interesantes. Por ejemplo, a diferencia de los anteriores "Y" y "O", esta operación es reversible: .

En gráficos por computadora , el "módulo adicional dos" se usa cuando se muestran sprites en la imagen: su aplicación repetida elimina el sprite de la imagen. Debido a la involutividad, la misma operación ha encontrado aplicación en criptografía como la implementación más simple de un cifrado absolutamente seguro ( cifrado de Vernam ). La "adición de módulo dos" también se puede usar para intercambiar dos variables usando el algoritmo de intercambio XOR .

Además, esta operación se puede llamar "inversión de máscara", es decir, los bits que coinciden con el 1 en la máscara se invierten del número binario original.

En los lenguajes de programación comunes, las herramientas integradas solo implementan cuatro operaciones lógicas bit a bit: AND, OR, NOT y XOR . Para especificar una operación lógica bit a bit arbitraria, las enumeradas son suficientes y, además, como se desprende de la teoría de las funciones booleanas, uno puede restringirse a un conjunto aún más pequeño de operaciones básicas. También existen lenguajes de programación en los que existe una capacidad incorporada para realizar cualquier operación lógica binaria poco a poco. Por ejemplo, PL/I tiene una función BOOL incorporada cuyo tercer argumento es para especificar una operación lógica arbitraria que se aplicará bit a bit a los dos primeros argumentos [3] .

Cambios de bits

Las operaciones bit a bit también incluyen cambios de bits. Al cambiar, los valores de los bits se copian a los adyacentes en la dirección del cambio. Hay varios tipos de cambios: lógicos , aritméticos y cíclicos , según el procesamiento de los bits extremos.

También hay un desplazamiento a la izquierda (en la dirección del bit menos significativo al más significativo) ya la derecha (en la dirección del bit más significativo al menos significativo).

Desplazamiento lógico

Durante un cambio lógico, el valor del último bit en la dirección del cambio se pierde (se copia en el bit de acarreo) y el primer bit se convierte en cero.

Desplazamiento aritmético

Un cambio aritmético es similar a un cambio lógico, pero el número se considera un número con signo, representado en un código adicional. Entonces, con un desplazamiento a la derecha, el bit más significativo conserva su valor. El desplazamiento aritmético a la izquierda es idéntico al lógico.

Los desplazamientos aritméticos hacia la izquierda y hacia la derecha se utilizan para multiplicaciones y divisiones rápidas por 2.

Desplazamiento cíclico

En una rotación, el valor del último bit en la dirección del desplazamiento se copia en el primer bit (y se copia en el bit de acarreo).

También hay un cambio cíclico a través del bit de acarreo  , en el que el primer bit en la dirección del cambio recibe el valor del bit de acarreo y el valor del último bit se cambia al bit de acarreo.

En lenguajes de programación

Operadores y funciones integrados que implementan operaciones lógicas bit a bit en algunos lenguajes de programación:

Idioma NO Y O Excl. O Desplazar a la izquierda desplazar a la derecha Otro
C , C++ , Java [4] , C# , Ruby , Python , JavaScript ~ & | ^ << >>
Pascual [5] no y o xor shl shr
kotlin [6] inversión
PL/1 [7] YO NO YO Y IOR IEOR BOOL
¬ & | ¬
Prólogo [8] \ /\ \/

Interpretación 2-ádica

Un número entero escrito (en complemento a dos) en un registro binario infinito (en la dirección de las potencias positivas de dos) es un objeto natural para la teoría de los números p-ádicos para . El conjunto de enteros 2-ádicos (es decir, secuencias de bits infinitas arbitrarias) se puede ver como un álgebra booleana, al igual que el conjunto de valores de un registro de bits de longitud finita. Todas las operaciones bit a bit anteriores resultan ser asignaciones continuas . Aunque la programación práctica no tiene registros de longitud infinita, esto no impide el uso de este hecho teórico en criptografía para crear algoritmos de encriptación de alta velocidad.

Aplicaciones prácticas

Implementación física de operaciones de bits

La implementación de operaciones de bit puede, en principio, ser cualquiera: mecánica (incluyendo hidráulica y neumática), química, térmica, [9] eléctrica, magnética y electromagnética (rango - IR, visible óptico, UV, y más en orden descendente de longitudes de onda ). ), así como en forma de combinaciones, por ejemplo, electromecánicas .

En la primera mitad del siglo XX, antes de la invención de los transistores , se utilizaban relés electromecánicos y válvulas de vacío .

En condiciones de incendio y explosión, todavía se utilizan dispositivos lógicos neumáticos (neumónica).

Las implementaciones electrónicas más comunes de operaciones de bits que utilizan transistores , por ejemplo, lógica de resistencia-transistor (RTL), lógica de diodo-transistor (DTL), lógica de acoplamiento de emisor (ECL), lógica de transistor-transistor (TTL), lógica N-MOS , CMOS -lógica, etc.

En computación cuántica, de las operaciones booleanas enumeradas, solo NOT y excl. O (con algunas reservas). No hay análogos cuánticos de AND, OR, etc.

Diagramas lógicos de hardware

El resultado de una operación OR-NOT u OR en todos los bits de un registro binario comprueba si el valor del registro es cero; lo mismo, tomado de la salida excl. OR de dos registros, comprueba la igualdad de sus valores entre sí.

Las operaciones de bits se utilizan en generadores de caracteres y adaptadores de gráficos .

Uso en programación

A través de la implementación en la unidad lógica aritmética ( ALU ) del procesador , muchas operaciones de bit de registro están disponibles en hardware en lenguajes de bajo nivel . La mayoría de los procesadores implementan un registro NO como una instrucción; registro de dos argumentos AND, OR, XOR; verificación de igualdad cero (ver arriba); tres tipos de cambios de bits, así como cambios de bits cíclicos.

La operación de registro AND se utiliza para:

La operación de registro OR se utiliza para:

La operación de registro XOR se utiliza para invertir los bits de un registro con una máscara.

Los desplazamientos a la izquierda y a la derecha se utilizan para multiplicar por 2 y dividir enteros por 2, respectivamente, y extraer bits individuales.

Entonces, por ejemplo, en las tecnologías de red de Internet, la operación AND entre el valor de una dirección IP y el valor de una máscara de subred se usa para determinar si una dirección dada pertenece a una subred.

Notas

  1. Lenguaje ensamblador del microprocesador 8086 . Consultado el 19 de enero de 2010. Archivado desde el original el 26 de enero de 2013.
  2. Multiplicación y división // Manual del sistema de programación Turbo Assembler / Ed. SB Orlova.
  3. PL/I Language Reference Archivado el 25 de septiembre de 2018 en Wayback Machine  - p. 393
  4. La especificación del lenguaje Java. Operaciones con enteros . Fecha de acceso: 17 de enero de 2010. Archivado desde el original el 28 de febrero de 2012.
  5. Free Pascal: Guía de referencia. Operadores lógicos . Consultado el 20 de mayo de 2018. Archivado desde el original el 21 de mayo de 2018.
  6. Tipos básicos: lenguaje de programación Kotlin . Kotlin. Consultado el 2 de enero de 2017. Archivado desde el original el 2 de enero de 2017.
  7. Referencia del lenguaje PL/I . Consultado el 17 de enero de 2010. Archivado desde el original el 25 de septiembre de 2018.
  8. Manual de GNU-Prolog. aritmética _ Fecha de acceso: 18 de enero de 2010. Archivado desde el original el 23 de enero de 2010.
  9. Se ha creado una puerta lógica para una computadora térmica  // Lenta.ru . - Asunto. 05.11.2007 .