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.
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 .
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 |
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 |
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 |
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] .
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).
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.
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.
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.
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] | \ | /\ | \/ |
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.
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.
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 .
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.