c++ - una - ¿Es(n & m)<= m siempre cierto?
señales de que te van a robar (5)
Sí, siempre es cierto para los tipos de datos integrales sin firmar.
Dependiendo del valor de la máscara n
, algunos bits 1 en m
pueden convertirse en bits 0; todos los bits que son 0 en m
permanecerán 0
en el resultado. Desde el punto de mantener m
más alto posible, lo mejor que podría suceder es que todos los 1 bits permanecerían en su lugar, en cuyo caso el resultado sería m
. En todos los demás casos, el resultado será menor que m
.
Dados n
y m
tipos integrales sin signo, será la expresión
(n & m) <= m
siempre será cierto ?
Sí. Para complementar las razones descritas en las otras respuestas, algunos ejemplos binarios dejan bastante claro que no será posible hacer que el resultado sea mayor que cualquiera de los argumentos:
0
1
------
0
1
1
------
1
111011
11111
------
11011
111011
111011
------
111011
Dados los dos argumentos, lo más alto que podemos lograr es si ambos argumentos tienen el mismo valor, siendo el resultado igual al valor de los dos argumentos (último ejemplo anterior).
Es imposible hacer que el resultado sea más grande sin importar a lo que establecemos los argumentos. Si eres capaz, entonces estamos en serios problemas. ;)
Sea m
1 m 2 m 3 m 4 m 5 m 6 m 7 m 8 donde m i es un poco .
Ahora sea n 1 n 2 n 3 n 4 n 5 n 6 n 7 n 8 .
¿Qué sería m & n
? Todos los bits en m
que originalmente eran 0, permanecerán 0, porque 0 & anything
es 0. Todos los bits que fueron 1, serán 1, solo que el bit correspondiente en n
es 1.
Lo que significa que en el "mejor" caso, el número será el mismo, pero nunca podrá aumentar de tamaño, ya que no se pueden crear 0 & anything
desde 0 & anything
.
Vamos a tener un ejemplo para tener una mejor intuición:
Sea m
11101011.
¿Cuáles son los números que son más grandes que m
? 11111111 (trivial), 11111011, 11101111, 11111010, 11111110.
n 1 n 2 n 3 n 4 n 5 n 6 n 7 n 8
↓ ↓ ↓ ↓ ↓ ↓ &
1 1 1 0 1 0 1 1
-----------------------
De ninguna manera puedes obtener cualquiera de las combinaciones anteriores haciendo esto.
Si es cierto.
Debería ser evidente que una condición necesaria para y > x
es que al menos una posición de bit se establece en 1
en y
pero 0
en x
. Como &
no puede establecer un bit en 1
si los bits de operando correspondientes no estaban ya en 1
, el resultado no puede ser más grande que los operandos.
n & m
tiene todos los bits que se establecen en m
y en n
.
~n & m
tiene todos los bits que se configuran en m
pero no en n
.
Al agregar ambas cantidades se obtendrán todos los bits que se configuran en m
. Es decir, m
:
m = (n & m) + (~n & m)
m ≥ (n & m)