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 ...