operator logical entre diferencia bitwise c# operators bitwise-operators

c# - logical - Entender el comportamiento de un solo operador "&"(&) en enteros



diferencia entre & y && en c# (7)

Entiendo que el operador de un solo símbolo normalmente se usa para una operación ''a nivel de bit Y''. Sin embargo, ¿alguien puede ayudar a explicar los resultados interesantes que obtiene cuando lo usa para comparar dos números?

Por ejemplo;

(6 & 2) = 2 (10 & 5) = 0 (20 & 25) = 16 (123 & 20) = 16

Parece que no hay un vínculo lógico entre estos resultados, ¿me estoy perdiendo algo? La documentación en línea solo parece referirse a la comparación de booleanos o bits individuales.


Bitwize Y combina los bits en notación binaria uno por uno y el resultado son los bits que se encuentran entre los dos números.

Para convertir un número a binario necesitas entender el sistema binario.

Por ejemplo 6 = 110 binario

El 110 representa 1x4 + 1x2 + 0x1 = 6.

2 entonces es 0x4 + 1x2 + 0x1 = 2.

Bitwize y solo retiene las posiciones donde ambos números tienen la posición establecida, en este caso el bit para 2 y el resultado es 2.

Cada bit adicional es el doble del último, por lo que un número de 4 bits utiliza los multiplicadores 8, 4, 2, 1 y, por lo tanto, puede representar todos los números del 0 al 15 (la suma de los multiplicadores).


Compara las representaciones binarias de cada uno de esos.

110 & 010 = 010 1010 & 0101 = 0000 10100 & 11001 = 10000 1111011 & 0010100 = 0010000

En cada caso, un dígito es 1 en el resultado solo cuando es 1 en el lado izquierdo Y derecho de la entrada.


Debe convertir sus números a representación binaria y luego verá que el enlace entre los resultados como 6 y 2 = 2 es en realidad 110 y 010 = 010, etc. 10 y 5 es 1010 y 0101 = 0000


El AND a nivel de bits hace exactamente eso: realiza una operación AND en los Bits.

Así que para anticipar el resultado necesitas mirar los bits, no los números.

Y te da 1, solo si hay 1 en ambos números en la misma posición:

6(110) & 2(010) = 2(010) 10(1010) & 5(0101) = 0(0000)

Un bit a bit O te dará 1 si hay 1 en cualquiera de los números en la misma posición:

6(110) | 2(010) = 6(110) 10(1010) | 5(0101) = 15(1111)


El binario y la operación se realizan en los enteros, representados en binario. Por ejemplo

110 (6) 010 (2) -------- 010 (2)


Internamente, los enteros se almacenan en formato binario . Le sugiero que lea sobre eso. Saber acerca de la representación de números en modo bit es muy importante.

Dicho esto, la comparación a nivel de bits compara los bits de los parámetros:

Decimal: 6 & 2 = 2 Binary: 0110 & 0010 = 0010


6 = 0110 2 = 0010 6 & 2 = 0010 20 = 10100 25 = 11001 20 & 25 = 10000

(parece que tu cálculo es incorrecto para este)

Etc ...