operators - desplazamiento - operadores de bits en c
¿Cómo funciona el operador de complemento bit a bit(~)? (12)
Como otros mencionaron, simplemente voltearon bits (cambia uno a cero y cero a uno) y dado que se usa en.wikipedia.org/wiki/Two%27s_complement obtienes el resultado que viste.
Una cosa para agregar es por qué se usa el complemento de dos, esto es para que las operaciones en números negativos sean las mismas que en números positivos. Piense en -3
como el número al que se deben agregar 3
para obtener el cero y verá que este número es 1101
, recuerde que la adición binaria es igual a la escuela primaria (decimal) y que solo lleva una al llegar a dos en lugar de 10.
1101 +
0011 // 3
=
10000
=
0000 // lose carry bit because integers have a constant number of bits.
Por lo tanto, 1101
es -3
, voltea los bits obtienes 0010
que son dos.
¿Por qué es que ~ 2 es -3?
Creo que para la mayoría de las personas la parte de confusión proviene de la diferencia entre el número decimal y el número binario con signo, así que primero aclaremos esto:
para el mundo decimal humano: 01 significa 1, -01 significa -1, para el mundo binario de la computadora: 101 significa 5 si no está firmado. 101 significa (-4 + 1) si está firmado mientras el dígito firmado está en la posición x. | X
entonces 2''s volteado bit = ~ 2 = ~ (010) = 101 = -4 + 1 = -3 la confusión proviene de mezclar el resultado firmado (101 = -3) y el resultado no ligado (101 = 5)
El operador bit a bit es un operador unario que trabaja según el método de signo y magnitud según mi experiencia y conocimiento.
Por ejemplo ~ 2 daría como resultado -3.
Esto se debe a que el operador de bits primero representaría el número en signo y magnitud que es 0000 0010 (operador de 8 bits) donde el MSB es el bit de signo.
Luego, más tarde tomaría el número negativo de 2, que es -2.
-2 se representa como 1000 0010 (operador de 8 bits) en signo y magnitud.
Luego agrega un 1 al LSB (1000 0010 + 1) que le da 1000 0011.
Que es -3.
El operador de complemento Bitwise (~) es un operador unario .
Funciona de acuerdo con los siguientes métodos
Primero convierte el número decimal dado a su valor binario correspondiente. En el caso de 2, primero convierte 2 a 0000 0010 (a un número binario de 8 bits).
Luego convierte todos los 1 en el número en 0, y todos los ceros en 1, luego el número se convertirá en 1111 1101.
esa es la representación del complemento de 2 de -3.
Para encontrar el valor sin signo usando el complemento, es decir, simplemente para convertir 1111 1101 a decimal (= 4294967293) podemos simplemente usar el% u durante la impresión.
Esta operación es un complemento, no una negación.
Considere que ~ 0 = -1, y trabaje desde allí.
El algoritmo para la negación es "complemento, incremento".
¿Sabías? También hay "un complemento" donde los números inversos son simétricos, y tiene tanto un 0 como un -0.
Primero tenemos que dividir el dígito dado en sus dígitos binarios y luego invertirlo agregando el último dígito binario. Después de esta ejecución tenemos que dar el signo opuesto al dígito anterior que estamos encontrando el complemento ~ 2 = -3 Explicación : La forma binaria 2s es 00000010 cambia a 11111101 este es el complemento, luego complementado 00000010 + 1 = 00000011 que es la forma binaria de tres y con -sign Ie, -3
Recuerde que los números negativos se almacenan como el complemento de dos de la contraparte positiva. Como ejemplo, aquí está la representación de -2 en complemento de dos: (8 bits)
1111 1110
La forma de obtener esto es tomando la representación binaria de un número, tomando su complemento (invirtiendo todos los bits) y agregando uno. Dos comienzan como 0000 0010, y al invertir los bits obtenemos 1111 1101. Al agregar uno, obtenemos el resultado anterior. El primer bit es el bit de signo, lo que implica un negativo.
Echemos un vistazo a cómo obtenemos ~ 2 = -3:
Aquí hay dos de nuevo:
0000 0010
Simplemente voltee todos los bits y obtenemos:
1111 1101
Bueno, ¿cómo se ve el -3 en complemento a dos? Comience con positivo 3: 0000 0011, voltee todos los bits a 1111 1100 y agregue uno para convertirse en valor negativo (-3), 1111 1101.
Entonces, si simplemente inviertes los bits en 2, obtienes la representación del complemento de dos de -3.
El operador del complemento (~) SOLO FLIPS BITS. Depende de la máquina interpretar estos bits.
Sé que la respuesta a esta pregunta se publicó hace mucho tiempo, pero quería compartir mi respuesta para el mismo.
Para encontrar el complemento de un número, primero encuentre su equivalente binario. Aquí, el número decimal 2
se representa como 0000 0010
en forma binaria. Ahora tomando su propio complemento invirtiendo (volteando todos los 1 en 0 y todos los 0 en 1) todos los dígitos de su representación binaria, lo que dará como resultado:
0000 0010 → 1111 1101
Este es el complemento de uno del número decimal 2. Y desde el primer bit, es decir, el bit de signo es 1 en el número binario, significa que el signo es negativo para el número que almacena. (aquí, el número referido no es 2 sino el complemento de 2).
Ahora, dado que los números se almacenan como complemento de 2 (tomando el complemento de un número más uno), para mostrar este número binario, 1111 1101
, en decimal, primero tenemos que encontrar su complemento de 2, que será:
1111 1101 → 0000 0010 + 1 → 0000 0011
Este es el complemento de 2. La representación decimal del número binario, 0000 0011
, es 3
. Y, dado que el bit de signo fue uno como se mencionó anteriormente, la respuesta resultante es -3
.
Sugerencia: si lee este procedimiento detenidamente, entonces habrá observado que el resultado para el operador de complemento de uno es, en realidad, el número (operando - en el que se aplica este operador) más uno con un signo negativo. Puedes probar esto con otros números también.
Simplemente ...........
Como complemento de 2 de cualquier número que podamos calcular invirtiendo todos los 1 a 0 y viceversa, le añadiremos 1.
Aquí N = ~ N produce resultados - (N + 1) siempre. Debido a que el sistema almacena datos en forma de complemento de 2, lo que significa que almacena ~ N así.
~N = -(~(~N)+1) =-(N+1).
Por ejemplo::
N = 10 = 1010
Than ~N = 0101
so ~(~N) = 1010
so ~(~N) +1 = 1011
Ahora el punto es de donde viene Minus. Mi opinión es que supongo que tenemos un registro de 32 bits, lo que significa 2 ^ 31 -1 bit involucrados en la operación y para descansar un bit cuyo cambio en cómputo anterior (complemento) almacena como bit de signo que es 1 usualmente. Y obtenemos un resultado como ~ 10 = -11.
~ (-11) = 10;
Lo anterior es verdadero si printf ("% d", ~ 0); obtenemos el resultado: -1;
Pero printf ("% u", ~ 0) que resultado: 4294967295 en la máquina de 32 bits.
int a = 4; System.out.println (~ a); El resultado sería: -5
''~'' de cualquier entero en java representa el complemento de 1 del no. por ejemplo, estoy tomando ~ 4, lo que significa en representación binaria 0100. primero, la longitud de un entero es de cuatro bytes, es decir, 4 * 8 (8 bits para 1 byte) = 32. Entonces en la memoria del sistema 4 se representa como 0000 0000 0000 0000 0000 0000 0000 0100 ahora ~ el operador realizará el complemento de 1 en el binario anterior sin
es decir 1111 1111 1111 1111 1111 1111 1111 1011-> complemento de 1 el bit más significativo representa el signo del no (ya sea - o +) si es 1 y el signo es ''-'' si es 0, entonces el signo es ''+'' según este nuestro resultado es un número negativo, en java los números negativos se almacenan en forma de complemento a 2, el resultado adquirido lo tenemos que convertir en complemento a 2 (primero realiza el complemento de 1 y simplemente agrega el complemento de 1 a 1). todo el uno se convertirá en ceros, excepto el bit 1 más significativo (que es nuestro signo de representación del número, que significa para 31 bits restantes 1111 1111 1111 1111 1111 1111 1111 1011 (resultado adquirido de ~ operador) 1000 0000 0000 0000 0000 0000 0000 0100 (complemento de 1)
1 (complemento de 2)
1000 0000 0000 0000 0000 0000 0000 0101 ahora el resultado es -5 revisa este enlace para ver el video <[operadores de Bit Saver en java] https://youtu.be/w4pJ4cGWe9Y
~
voltea los bits en el valor.
Por qué ~2
es -3
tiene que ver con cómo se representan los números en modo bit. Los números se representan como complemento de dos .
Entonces, 2 es el valor binario
00000010
Y ~ 2 voltea los bits para que el valor sea ahora:
11111101
Cuál es la representación binaria de -3.
Javascript tilde (~) coacciona un valor dado para el complemento de uno: todos los bits están invertidos. Eso es todo tilde. No es signo obstinado. No agrega ni resta ninguna cantidad.
0 -> 1
1 -> 0
...in every bit position [0...integer nbr of bits - 1]
En los procesadores de escritorio estándar que usan lenguajes de alto nivel como JavaScript, la aritmética con BASE10 es la más común, pero tenga en cuenta que no es la única. Los bits en el nivel de la CPU están sujetos a interpretación en función de una serie de factores. En el nivel ''código'', en este caso JavaScript, se interpretan como un entero con signo de 32 bits por definición (dejemos flotantes fuera de esto). Piense en ello como cuántico, esos 32 bits representan muchos valores posibles, todos a la vez. Depende totalmente de la lente de conversión a través de la que los ve.
JavaScript Tilde operation (1''s complement)
BASE2 lens
~0001 -> 1110 - end result of ~ bitwise operation
BASE10 Signed lens (typical JS implementation)
~1 -> -2
BASE10 Unsigned lens
~1 -> 14
Todo lo anterior es cierto al mismo tiempo.