Articulo de referencia

Operación bit a bit

En programación informática , una operación bit a bit opera sobre una cadena de bits , una matriz de bits o un número binario (considerado como una cadena de bits) a nivel de su...

En programación informática , una operación bit a bit opera sobre una cadena de bits , una matriz de bits o un número binario (considerado como una cadena de bits) a nivel de sus bits individuales . Es una acción rápida y sencilla, fundamental para las operaciones aritméticas de nivel superior y directamente soportada por el procesador . La mayoría de las arquitecturas solo ofrecen unas pocas operaciones bit a bit de alto valor, presentadas como instrucciones de dos operandos donde el resultado reemplaza uno de los operandos de entrada.

En procesadores sencillos de bajo costo, las operaciones bit a bit suelen ser sustancialmente más rápidas que la división, varias veces más rápidas que la multiplicación y, a veces, significativamente más rápidas que la suma. Si bien los procesadores modernos generalmente realizan la suma y la multiplicación con la misma rapidez que las operaciones bit a bit debido a sus tuberías de instrucciones más largas y otras decisiones de diseño arquitectónico , las operaciones bit a bit suelen consumir menos energía debido al menor uso de recursos. [ 1 ]

operadores bit a bit

En las explicaciones que siguen, cualquier indicación de la posición de un bit se cuenta desde la derecha (el bit menos significativo) hacia la izquierda. Por ejemplo, el valor binario 0001 (decimal 1) tiene ceros en todas las posiciones excepto en la primera (es decir, la de más a la derecha).

NO

La negación bit a bit , o complemento bit a bit , es una operación unaria que realiza la negación lógica en cada bit, formando el complemento a uno del valor binario dado. Los bits que son 0 se convierten en 1, y los que son 1 se convierten en 0. Por ejemplo:

NO 0 111 (decimal 7) = 1 000 (8 decimales)
NO 10101011 (decimal 171) = 01010100 (decimal 84)

El resultado es igual al complemento a dos del valor menos uno. Si se utiliza la aritmética del complemento a dos, entonces NOT x = -x − 1.

Para los enteros sin signo , el complemento bit a bit de un número es el "reflejo especular" del número en el punto medio del rango del entero sin signo. Por ejemplo, para enteros sin signo de 8 bits, , NOT x = 255 - xque se puede visualizar en un gráfico como una línea descendente que efectivamente "invierte" un rango creciente de 0 a 255, a un rango decreciente de 255 a 0. Un ejemplo sencillo pero ilustrativo de su uso es invertir una imagen en escala de grises donde cada píxel se almacena como un entero sin signo.

Y

AND bit a bit de enteros de 4 bits

La operación AND bit a bit es una operación binaria que toma dos representaciones binarias de igual longitud y realiza la operación lógica AND en cada par de bits correspondientes. Así, si ambos bits en la posición comparada son 1, el bit en la representación binaria resultante es 1 (1  × 1  = 1); de lo contrario, el resultado es 0 (1  × 0  = 0 y 0  × 0  = 0). Por ejemplo:

 010 1 (decimal 5) Y 001 1 (decimal 3) = 000 1 (decimal 1)

Esta operación se puede utilizar para determinar si un bit en particular está activado (1) o desactivado (0). Por ejemplo, dado el patrón de bits 0011 (decimal 3), para determinar si el segundo bit está activado, utilizamos una operación AND bit a bit con un patrón de bits que contiene solo un 1 en el segundo bit:

 00 1 1 (decimal 3) Y 00 1 0 (decimal 2) = 00 1 0 (decimal 2)

Dado que el resultado 0010 no es cero, sabemos que el segundo bit del patrón original estaba activado. Esto se conoce comúnmente como enmascaramiento de bits . (Por analogía, el uso de cinta adhesiva cubre, o enmascara , las partes que no deben modificarse o que no son de interés. En este caso, los valores 0 enmascaran los bits que no son relevantes).

La operación AND bit a bit se puede utilizar para borrar bits (o indicadores ) seleccionados de un registro , donde cada bit representa un estado booleano individual . Esta técnica es una forma eficiente de almacenar varios valores booleanos utilizando la menor cantidad de memoria posible.

Por ejemplo, 0110 (decimal 6) puede considerarse un conjunto de cuatro indicadores numerados de derecha a izquierda, donde el primero y el cuarto están desactivados (0), y el segundo y el tercero están activados (1). El tercer indicador puede desactivarse mediante una operación AND bit a bit con el patrón que tiene un cero solo en el tercer bit:

 0 1 10 (decimal 6) Y 1 0 11 (decimal 11) = 0 0 10 (decimal 2)

Debido a esta propiedad, resulta fácil determinar si un número binario es par o impar comprobando el valor del bit de menor valor. Siguiendo el ejemplo anterior:

 011 0 (decimal 6) Y 000 1 (decimal 1) = 000 0 (decimal 0)

Como 6 Y 1 es cero, 6 es divisible por dos y por lo tanto es par.

O

OR bit a bit de enteros de 4 bits

La operación OR bit a bit es una operación binaria que toma dos patrones de bits de igual longitud y realiza la operación OR inclusiva lógica en cada par de bits correspondientes. El resultado en cada posición es 0 si ambos bits son 0, mientras que en caso contrario el resultado es 1. Por ejemplo:

 0 101 (decimal 5) O 0 011 (decimal 3) = 0 111 (decimal 7)

La operación OR bit a bit se puede utilizar para establecer a 1 los bits seleccionados del registro descrito anteriormente. Por ejemplo, el cuarto bit de 0010 (decimal 2) se puede establecer realizando una operación OR bit a bit con el patrón en el que solo se establece el cuarto bit:

0 0 1 0 (decimal 2) O 1 0 0 0 (decimal 8) = 1 0 1 0 (decimal 10)

XOR

XOR bit a bit de enteros de 4 bits

Una operación XOR bit a bit es una operación binaria que toma dos patrones de bits de igual longitud y realiza la operación lógica OR exclusiva en cada par de bits correspondientes. El resultado en cada posición es 1 si solo uno de los bits es 1, pero será 0 si ambos son 0 o ambos son 1. En esta operación, comparamos dos bits, obteniendo 1 si son diferentes y 0 si son iguales. Por ejemplo:

 0 10 1 (decimal 5) XOR 0 01 1 (decimal 3) = 0 11 0 (decimal 6)

La operación XOR bit a bit se puede utilizar para invertir bits seleccionados en un registro (también llamada inversión o volteo). Cualquier bit se puede invertir mediante una operación XOR con 1. Por ejemplo, dado el patrón de bits 0010 (decimal 2), el segundo y el cuarto bit se pueden invertir mediante una operación XOR bit a bit con un patrón de bits que contenga 1 en la segunda y cuarta posición:

0 0 1 0 (decimal 2) XOR 1 0 1 0 (decimal 10) = 1 0 0 0 (decimal 8)

Esta técnica puede utilizarse para manipular patrones de bits que representan conjuntos de estados booleanos.

Los programadores de lenguaje ensamblador y los compiladores optimizadores a veces utilizan la operación XOR como atajo para establecer el valor de un registro a cero. Realizar una operación XOR entre un valor y sí mismo siempre da como resultado cero, y en muchas arquitecturas esta operación requiere menos ciclos de reloj y menos memoria que cargar un valor cero y guardarlo en el registro.

Si el conjunto de cadenas de bits de longitud fija n (es decir, palabras de máquina ) se considera como un espacio vectorial n -dimensionalF2norte{\displaystyle {\bf {F}}_{2}^{n}}sobre el campoF2{\displaystyle {\bf {F}}_{2}}, entonces la suma de vectores corresponde a la operación XOR bit a bit.

Equivalentes matemáticos

Suponiendoincógnitay{\displaystyle x\geq y}Para números enteros no negativos, las operaciones bit a bit se pueden escribir de la siguiente manera :

NO(incógnita)=norte=0registro2incógnita2norte((incógnita2nortemod2+1)mod2)=(2registro2incógnita+11)incógnitaincógnitaYy=norte=0registro2incógnita2norte(incógnita2nortemod2)(y2nortemod2)incógnitaOy=norte=0registro2incógnita2norte(incógnita2nortemod2+y2nortemod2(incógnita2nortemod2)(y2nortemod2))incógnitaXORy=norte=0registro2incógnita2norte((incógnita2norte+y2norte)mod2){\displaystyle {\begin{aligned}\operatorname {NOT} (x)&=\sum _{n=0}^{\lfloor \log _{2}x\rfloor }2^{n}\left(\left(\left\lfloor {\frac {x}{2^{n}}}\right\rfloor {\bmod {2}}+1\right){\bmod {2}}\right)\\&=\left(2^{\lfloor \log _{2}x\rfloor +1}-1\right)-x\\[10pt]x\operatorname {AND} y&=\sum _{n=0}^{\lfloor \log _{2}x\rfloor }2^{n}\left(\left\lfloor {\frac {x}{2^{n}}}\right\rfloor {\bmod {2}}\right)\left(\left\lfloor {\frac {y}{2^{n}}}\right\rfloor {\bmod {2}}\right)\\[10pt]x\operatorname {OR} y&=\sum _{n=0}^{\lfloor \log _{2}x\rfloor }2^{n}{\Bigg (}\left\lfloor {\frac {x}{2^{n}}}\right\rfloor {\bmod {2}}+\left\lfloor {\frac {y}{2^{n}}}\right\rfloor {\bmod {2}}\\&\qquad \qquad -\left(\left\lfloor {\frac {x}{2^{n}}}\right\rfloor {\bmod {2}}\right)\left(\left\lfloor {\frac {y}{2^{n}}}\right\rfloor {\bmod {2}}\right){\Bigg )}\\[10pt]x\operatorname {XOR} y&=\sum _{n=0}^{\lfloor \log _{2}x\rfloor }2^{n}\left(\left(\left\lfloor {\frac {x}{2^{n}}}\right\rfloor +\left\lfloor {\frac {y}{2^{n}}}\right\rfloor \right){\bmod {2}}\right)\end{aligned}}}

Tabla de verdad para todos los operadores lógicos binarios

Existen 16 posibles funciones de verdad de dos variables binarias ; esto define una tabla de verdad , denominada tabla de búsqueda LUT2 , también conocida como orden de función booleana k=2 (2 entradas). Algunos proveedores utilizan el término conectivo [ 2 ] para instrucciones con un campo de 4 bits que identifica el conectivo binario específico; otros proveedores utilizan el término operación booleana [ 3 ] para 16 códigos de operación distintos.

Aquí están las operaciones equivalentes a nivel de bits de dos bits P y Q:

El equivalente ternario es una función booleana LUT3 de orden k=3 (tres entradas), que da como resultado una tabla de 256 operaciones, y en informática se denomina instrucción lógica ternaria bit a bit .

desplazamientos de bits

Los desplazamientos de bits a veces se consideran operaciones bit a bit, ya que tratan un valor como una serie de bits en lugar de como una cantidad numérica. En estas operaciones, los dígitos se mueven, o desplazan , hacia la izquierda o hacia la derecha. Los registros de un procesador tienen un ancho fijo, por lo que algunos bits se "desplazan fuera" del registro por un extremo, mientras que la misma cantidad de bits se "desplazan hacia adentro" desde el otro extremo; las diferencias entre los operadores de desplazamiento de bits radican en cómo determinan los valores de los bits desplazados hacia adentro.

Direccionamiento de bits

Si el ancho del registro (frecuentemente 32 o incluso 64) es mayor que el número de bits (normalmente 8) de la unidad direccionable más pequeña, frecuentemente llamada byte, las operaciones de desplazamiento inducen un esquema de direccionamiento de bytes a bits. De este modo, las orientaciones "izquierda" y "derecha" se toman de la escritura estándar de números en notación posicional , de manera que un desplazamiento a la izquierda aumenta y un desplazamiento a la derecha disminuye el valor del número; si se leen primero los dígitos de la izquierda, esto constituye una orientación big-endian . Sin tener en cuenta los efectos de borde en ambos extremos del registro, las operaciones de desplazamiento aritmético y lógico se comportan de la misma manera, y un desplazamiento de 8  posiciones de bit transporta el patrón de bits 1  posición de byte de la siguiente manera:

Cambio aritmético

Desplazamiento aritmético a la izquierda
Cambio aritmético a la derecha

En un desplazamiento aritmético (o desplazamiento fijo), los bits que se desplazan hacia afuera por cualquiera de los extremos se descartan. En un desplazamiento aritmético hacia la izquierda, se introducen ceros por la derecha; en un desplazamiento aritmético hacia la derecha, se introduce el bit de signo (el bit más significativo en complemento a dos) por la izquierda, preservando así el signo del operando.

Este ejemplo utiliza un registro de 8 bits, interpretado como complemento a dos:

 00010111 (decimal +23) DESPLAZAMIENTO A LA IZQUIERDA = 0010111 0 (decimal +46)
 10010111 (decimal −105) DESPLAZAMIENTO A LA DERECHA = 1 1001011 (decimal −53)

En el primer caso, el dígito más a la izquierda se desplazó más allá del final del registro y se colocó un nuevo 0 en la posición más a la derecha. En el segundo caso, el 1 más a la derecha se desplazó hacia afuera (quizás hacia el indicador de acarreo ) y se copió un nuevo 1 en la posición más a la izquierda, conservando el signo del número. A veces, los desplazamientos múltiples se reducen a un solo desplazamiento de cierta cantidad de dígitos. Por ejemplo:

 00010111 (decimal +23) DESPLAZAMIENTO A LA IZQUIERDA DE DOS = 010111 00 (decimal +92)

Un desplazamiento aritmético a la izquierda de n es equivalente a multiplicar por 2n ( siempre que el valor no se desborde ), mientras que un desplazamiento aritmético a la derecha de n de un valor en complemento a dos es equivalente a calcular la parte entera de la división por 2n . Si el número binario se trata como complemento a uno , entonces la misma operación de desplazamiento a la derecha resulta en una división por 2n y un redondeo hacia cero .

Cambio lógico

En un desplazamiento lógico (desplazamiento con relleno de ceros), se insertan ceros para reemplazar los bits descartados. Por lo tanto, los desplazamientos lógicos y aritméticos a la izquierda son exactamente iguales.

Sin embargo, dado que el desplazamiento lógico a la derecha inserta bits de valor 0 en el bit más significativo, en lugar de copiar el bit de signo, es ideal para números binarios sin signo, mientras que el desplazamiento aritmético a la derecha es ideal para números binarios con signo en complemento a dos .

Desplazamiento circular

Otra forma de desplazamiento es el desplazamiento circular , rotación bit a bit o rotación de bits .

Girar

En esta operación, a veces denominada rotación sin acarreo , los bits se "rotan" como si se unieran los extremos izquierdo y derecho del registro. El valor que se desplaza hacia la derecha durante un desplazamiento a la izquierda es el mismo que se desplazó hacia la izquierda, y viceversa para una operación de desplazamiento a la derecha. Esto resulta útil si es necesario conservar todos los bits existentes y se utiliza con frecuencia en criptografía digital .

Rotar a través del transporte

La rotación a través del acarreo es una variante de la operación de rotación, donde el bit que se desplaza hacia adentro (en cualquiera de los extremos) es el valor antiguo del indicador de acarreo, y el bit que se desplaza hacia afuera (en el otro extremo) se convierte en el nuevo valor del indicador de acarreo.

Una sola instrucción `rotate through carry` puede simular un desplazamiento lógico o aritmético de una posición configurando previamente el indicador de acarreo. Por ejemplo, si el indicador de acarreo contiene 0, se x RIGHT-ROTATE-THROUGH-CARRY-BY-ONEproduce un desplazamiento lógico a la derecha, y si contiene una copia del bit de signo, se produce un desplazamiento aritmético a la derecha. Por esta razón, algunos microcontroladores, como los PICx RIGHT-ROTATE-THROUGH-CARRY-BY-ONE de gama baja, solo incluyen las instrucciones `rotate` y `rotate through carry` , y no se molestan en usar instrucciones de desplazamiento aritmético o lógico.

La rotación a través del acarreo es especialmente útil al realizar desplazamientos de números mayores que el tamaño de palabra nativo del procesador , ya que si un número grande se almacena en dos registros, el bit que se desplaza desde un extremo del primer registro debe entrar por el otro extremo del segundo. Con la rotación a través del acarreo, ese bit se "guarda" en el indicador de acarreo durante el primer desplazamiento, listo para entrar durante el segundo desplazamiento sin ninguna preparación adicional.

En lenguajes de alto nivel

En la familia de lenguajes C

En los lenguajes C y C++, los operadores de desplazamiento lógico son " " para desplazamiento a la izquierda y " " para desplazamiento a la derecha. El número de posiciones a desplazar se proporciona como segundo argumento del operador. Por ejemplo,<<>>

x = y << 2 ;

asigna xel resultado de desplazar ydos bits a la izquierda, lo que equivale a una multiplicación por cuatro.

Los desplazamientos pueden resultar en un comportamiento definido por la implementación o en un comportamiento indefinido , por lo que se debe tener cuidado al usarlos. El resultado de un desplazamiento de un número de bits mayor o igual al tamaño de la palabra es un comportamiento indefinido en C y C++. [ 4 ] [ 5 ] El desplazamiento a la derecha de un valor negativo está definido por la implementación y no se recomienda según las buenas prácticas de codificación; [ 6 ] el resultado de un desplazamiento a la izquierda de un valor con signo es indefinido si el resultado no se puede representar en el tipo de resultado. [ 4 ]

En C#, el desplazamiento a la derecha es un desplazamiento aritmético cuando el primer operando es de tipo int o long. Si el primer operando es de tipo uint o ulong, el desplazamiento a la derecha es un desplazamiento lógico. [ 7 ]

cambios circulares

La familia de lenguajes C carece de un operador de rotación (aunque C++20 proporciona std::rotly std::rotr), pero se puede sintetizar uno a partir de los operadores de desplazamiento. Se debe tener cuidado para asegurar que la instrucción esté bien formada para evitar comportamientos indefinidos y ataques de temporización en software con requisitos de seguridad. [ 8 ] Por ejemplo, una implementación ingenua que rota a la izquierda un valor sin signo de 32 bits xpor nposiciones es simplemente

uint32_t x = ..., n = ...; uint32_t y = ( x << n ) | ( x >> ( 32 - n ));

Sin embargo, un desplazamiento de 0bits produce un comportamiento indefinido en la expresión de la derecha (x >> (32 - n))porque 32 - 0es 32, y 32está fuera del rango 0–31 inclusive. Un segundo intento podría resultar en

uint32_t x = ..., n = ...; uint32_t y = n ? ( x << n ) | ( x >> ( 32 - n )) : x ;

donde se prueba la cantidad de desplazamiento para asegurar que no introduzca un comportamiento indefinido. Sin embargo, la bifurcación agrega una ruta de código adicional y presenta una oportunidad para el análisis de tiempos y ataques, lo cual suele ser inaceptable en software de alta integridad. [ 8 ] Además, el código se compila en múltiples instrucciones de máquina, lo cual suele ser menos eficiente que la instrucción nativa del procesador.

Para evitar el comportamiento indefinido y las bifurcaciones en GCC y Clang , se recomienda lo siguiente. Muchos compiladores reconocen este patrón y el compilador emitirá una única instrucción de rotación: [ 9 ] [ 10 ] [ 11 ]

uint32_t x = ..., n = ...; uint32_t y = ( x << n ) | ( x >> ( - n & 31 ));

También hay intrínsecos específicos del compilador que implementan desplazamientos circulares , como _rotl8, _rotl16 , _rotr8, _rotr16 en Microsoft Visual C++ . Clang proporciona algunos intrínsecos de rotación para compatibilidad con Microsoft que sufren los problemas anteriores. [ 11 ] GCC 15 introdujo los intrínsecos __builtin_stdc_rotate_lefty __builtin_stdc_rotate_right, pero no los optimiza correctamente. Intel también proporciona intrínsecos x86 .

Java

En Java , todos los tipos enteros son con signo, por lo que los operadores " " y " " realizan desplazamientos aritméticos. Java agrega el operador " " para realizar desplazamientos lógicos a la derecha, pero dado que las operaciones de desplazamiento lógico y aritmético a la izquierda son idénticas para enteros con signo, no existe el operador " " en Java.<<>>>>><<<

Más detalles sobre los operadores de desplazamiento de Java: [ 12 ]

  • Los operadores <<(desplazamiento a la izquierda), >>(desplazamiento a la derecha con signo) y >>>(desplazamiento a la derecha sin signo) se denominan operadores de desplazamiento .
  • El tipo de la expresión de desplazamiento es el tipo promovido del operando izquierdo. Por ejemplo, aByte >>> 2es equivalente a .((int)aByte)>>>2
  • Si el tipo promovido del operando izquierdo es int, solo se utilizan los cinco bits de menor orden del operando derecho como distancia de desplazamiento. Es como si el operando derecho se sometiera a un operador lógico AND bit a bit & con el valor de máscara 0x1f (0b11111). [ 13 ] Por lo tanto, la distancia de desplazamiento utilizada siempre está en el rango de 0 a 31, ambos inclusive.
  • Si el tipo promovido del operando izquierdo es largo, entonces solo se utilizan los seis bits de orden más bajo del operando derecho como distancia de desplazamiento. Es como si el operando derecho se sometiera a un operador lógico AND bit a bit & con el valor de máscara 0x3f (0b111111). [ 13 ] Por lo tanto, la distancia de desplazamiento utilizada siempre está en el rango de 0 a 63, ambos inclusive.
  • El valor de n >>> ses n posiciones de bits desplazadas a la derecha con extensión de cero.
  • En las operaciones de bits y desplazamiento, el tipo bytese convierte implícitamente a int. Si el valor del byte es negativo, el bit más significativo es uno, y luego se utilizan unos para rellenar los bytes adicionales en el entero. Por lo tanto, dará como resultado .byteb1=-5;inti=b1|0x0200;i == -5

JavaScript

JavaScript utiliza operaciones bit a bit para evaluar cada una de dos o más unidades colocadas en 1 o 0. [ 14 ]

Pascal

En Pascal, así como en todos sus dialectos (como Object Pascal y Standard Pascal ), los operadores de desplazamiento lógico a la izquierda y a la derecha son " shl" y " shr", respectivamente. Incluso para enteros con signo, shrse comporta como un desplazamiento lógico y no copia el bit de signo. El número de posiciones a desplazar se proporciona como segundo argumento. Por ejemplo, lo siguiente asigna a x el resultado de desplazar y a la izquierda dos bits:

x := y shl 2 ;

Otro

Aplicaciones

Las operaciones bit a bit son necesarias, en particular, en la programación de bajo nivel, como en los controladores de dispositivos , los gráficos de bajo nivel, el ensamblaje de paquetes de protocolos de comunicación y la decodificación.

Aunque las máquinas suelen tener instrucciones integradas eficientes para realizar operaciones aritméticas y lógicas, todas estas operaciones pueden realizarse combinando operadores bit a bit y comprobación de ceros de diversas maneras. [ 15 ] Por ejemplo, aquí se muestra una implementación en pseudocódigo de la multiplicación del antiguo Egipto que ilustra cómo multiplicar dos enteros arbitrarios a( mayores que ) utilizando únicamente desplazamientos de bits y suma:bab

c 0 mientras b 0 si ( b y 1 ) 0 c c + a desplaza a a la izquierda en 1 desplaza b a la derecha en 1 devuelve c

Otro ejemplo es una implementación en pseudocódigo de la suma, que muestra cómo calcular la suma de dos números aenteros butilizando operadores bit a bit y comprobación de cero:

mientras a 0 c b y a b b xor a desplaza c a la izquierda en 1 a c devuelve b

Álgebra booleana

En ocasiones, resulta útil simplificar expresiones complejas compuestas por operaciones bit a bit, por ejemplo, al escribir compiladores. El objetivo de un compilador es traducir un lenguaje de programación de alto nivel al código máquina más eficiente posible. El álgebra booleana se utiliza para simplificar expresiones bit a bit complejas.

Y

  • x & y = y & x
  • x & (y & z) = (x & y) & z
  • x & 0xFFFF = x[ 16 ]
  • x & 0 = 0
  • x & x = x

O

  • x | y = y | x
  • x | (y | z) = (x | y) | z
  • x | 0 = x
  • x | 0xFFFF = 0xFFFF
  • x | x = x

NO

  • ~(~x) = x

XOR

  • x ^ y = y ^ x
  • x ^ (y ^ z) = (x ^ y) ^ z
  • x ^ 0 = x
  • x ^ y ^ y = x
  • x ^ x = 0
  • x ^ 0xFFFF = ~x

Además, la operación XOR se puede componer utilizando las 3 operaciones básicas (AND, OR, NOT).

  • a ^ b = (a | b) & (~a | ~b)
  • a ^ b = (a & ~b) | (~a & b)

Otros

  • x | (x & y) = x
  • x & (x | y) = x
  • ~(x | y) = ~x & ~y
  • ~(x & y) = ~x | ~y
  • x | (y & z) = (x | y) & (x | z)
  • x & (y | z) = (x & y) | (x & z)
  • x & (y ^ z) = (x & y) ^ (x & z)
  • x + y = (x ^ y) + ((x & y) << 1)
  • x - y = ~(~x + y)

Inversas y resolución de ecuaciones

Resolver ecuaciones con variables en álgebra booleana puede ser complicado, ya que, a diferencia del álgebra convencional, varias operaciones no tienen inversas. Las operaciones sin inversa pierden parte de los bits de datos originales al ejecutarse, y no es posible recuperar esta información faltante.

  • Tiene inverso
    • NO
    • XOR
    • Gire a la izquierda
    • Gire a la derecha
  • No hay reverso
    • Y
    • O
    • Desplazamiento a la izquierda
    • Desplazarse a la derecha

Orden de operaciones

Las operaciones que aparecen al principio de esta lista se ejecutan primero. Consulte el artículo principal para obtener una lista más completa.

Véase también

Referencias

  1. "Blog de diseño de bajo consumo de CMicrotek" . CMicrotek . Consultado el 12 de agosto de 2015 .
  2. "Operaciones de conexión" (PDF) . Manual de referencia - Sistema de procesamiento de datos IBM 7030 (PDF) . IBM . Agosto de 1961. págs. 74–77 . A22-6530-2 . Consultado el 5 de mayo de 2015 a través de bitsavers.org. 
  3. "Aritmética y lógica" (PDF) . Procesador de datos programado 6 - Manual (PDF) . Digital Equipment Corporation . Agosto de 1964. pág. 32. F-65 . Consultado el 5 de mayo de 2015 a través de bitsavers.org. 
  4. 1 2 JTC1/SC22/WG14 N843 "Lenguaje de programación C" Archivado el 3 de agosto de 2022 en Wayback Machine , sección 6.5.7
  5. "Operadores aritméticos - cppreference.com" . en.cppreference.com . Consultado el 6 de julio de 2016 .
  6. "INT13-C. Utilice operadores bit a bit solo en operandos sin signo" . CERT: Estándares de codificación segura . Instituto de Ingeniería de Software, Universidad Carnegie Mellon . Consultado el 7 de septiembre de 2015 .
  7. "Operador (Referencia de C#)" . Microsoft . Consultado el 14 de julio de 2013 .
  8. 1 2 "¿Rotación de tiempo casi constante que no viole los estándares?" . Stack Exchange Network . Recuperado el 12 de agosto de 2015 .
  9. "Optimización deficiente del modismo de rotación portátil" . Proyecto GNU GCC . Consultado el 11 de agosto de 2015 .
  10. "¿Rotación circular que no viole el estándar C/C++?" . Foros de desarrolladores de Intel . Consultado el 12 de agosto de 2015 .
  11. 1 2 "La constante no se propaga al ensamblado en línea, lo que resulta en " la restricción 'I' espera una expresión constante entera " . Proyecto LLVM . Recuperado el 11 de agosto de 2015 .
  12. Especificación del lenguaje Java, sección 15.19. Operadores de desplazamiento
  13. 1 2 "Capítulo 15. Expresiones" . oracle.com .
  14. "JavaScript Bitwise" . W3Schools.com .
  15. "Síntesis de operaciones aritméticas mediante trucos de desplazamiento de bits" . Bisqwit.iki.fi. 15 de febrero de 2014. Consultado el 8 de marzo de 2014 .
  16. A lo largo de este artículo, 0xFFFF se refiere a todos los bits 1 para el ancho de su tipo de datos, no al valor real FFFF 16 .
  17. - es una negación aquí, no una resta.
  18. - aquí se trata de una resta, no de una negación.
  • La calculadora bit a bit en línea admite AND, OR y XOR bit a bit.
  • XORcat , una herramienta para la operación XOR bit a bit en archivos/flujos.
  • División mediante desplazamiento de bits
  • " Operaciones bit a bit módulo N " por Enrique Zeleny, Proyecto de demostraciones de Wolfram .
  • " Gráficos de composiciones de operaciones bit a bit " por Enrique Zeleny, Proyecto de demostraciones de Wolfram.
Obtenido de " https://en.wikipedia.org/w/index.php?title=Bitwise_operation&oldid=1361910524#AND "