¿Cómo funciona el operador de complemento bit a bit (~ tilde)?


¿Por qué es que ~2 es igual a -3? ¿Cómo funciona el operador ~?

Author: Pshemo, 2009-04-26

12 answers

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 el 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 comienza como 0000 0010, y al invertir los bits obtenemos 1111 1101. Agregar uno nos da el resultado anterior. El primer bit es el bit de signo, lo que implica un negativo.

Así que echemos un vistazo a cómo obtenemos ~2 = -3:

Aquí hay dos de nuevo:

0000 0010

Simplemente voltear todos los bits y obtenemos:

1111 1101

Bueno, ¿cómo se ve -3 en el complemento de 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.

Así que si simplemente inviertes los bits en 2, obtienes la representación del complemento de los dos de -3.

El operador complemento (~) SIMPLEMENTE VOLTEA BITS. Se depende de la máquina interpretar estos bits.

 244
Author: Anthony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-16 10:25:16

~ voltea los bits en el valor.

Why ~2 is -3 tiene que ver con cómo se representan los números a nivel de bits. Los números se representan como complemento de dos .

Entonces, 2 es el valor binario

00000010

Y ~2 voltea los bits por lo que el valor es ahora:

11111101

Que, es la representación binaria de -3.

 33
Author: driis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-23 14:51:17

Como otros mencionaron ~ simplemente volteó los bits (cambia uno a cero y cero a uno) y como se usa el complemento de dos, obtiene el resultado que vio.

Una cosa a 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 3 debe agregarse para obtener cero y verá que este número es 1101, recuerde que la adición binaria es igual que escuela primaria (decimal) suma solo se lleva uno cuando se llega 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 que obtienes 0010 que son dos.

 14
Author: Motti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-26 20:04:18

Esta operación es un complemento, no una negación.

Considere que ~0 = -1, y trabaje a partir de ahí.

El algoritmo para la negación es, "complemento, incremento".

¿Lo sabías? También hay "complemento de uno" donde los números inversos son simétricos, y tiene tanto un 0 como un -0.

 9
Author: gbarry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-26 20:22:13

Int a = 4; Sistema.fuera.println (~a); El resultado sería :-5

' ~ ' de cualquier entero en java representa el complemento de 1 del no. por ejemplo, estoy tomando ~4, que significa en representación binaria 0100. primero , la longitud de un entero es cuatro octetos, es decir 4 * 8(8 pedacitos para 1 octeto) = 32. Así que en la memoria del sistema 4 se representa como 0000 0000 0000 0000 0000 0000 0000 0100 ahora ~ operator realizará el complemento de 1 en el binario anterior no

Es decir 1111 1111 1111 1111 1111 1111 1111 1011->1 complemento el bit más significativo representa el signo del no (ya sea - o +) si es 1, entonces el signo es '-' si es 0 entonces el signo es'+' según esto nuestro resultado es un número negativo, en Java los números negativos se almacenan en forma de complemento de 2, el resultado adquirido tenemos que convertir en complemento de 2 (primero realizar complemento de 1 y solo agregar complemento de 1 a 1). todo el uno se convertirá en ceros, excepto el bit más significativo 1(que es nuestra representación de signo del número, que significa para el restante 31 trozo 1111 1111 1111 1111 1111 1111 1111 1011 (adquirida resultado de operador ~ ) 1000 0000 0000 0000 0000 0000 0000 0100 (1 complemento)

1 (complemento de 2)

1000 0000 0000 0000 0000 0000 0000 0101 ahora el resultado es -5 echa un vistazo a este enlace para ver el video https://youtu.be/w4pJ4cGWe9Y

 4
Author: Film geek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-14 07:21:27

Sé que la respuesta a esta pregunta se publicó hace mucho tiempo, pero quería compartir mi respuesta para la misma.

Para encontrar el complemento de uno 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 el complemento de su uno invirtiendo (volteando todos los 1 en 0 y todos los 0 en 1) todos los dígitos de su representación binaria, lo que resultará en:

0000 0010 → 1111 1101

Este es el complemento del decimal número 2. Y dado que 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 es no 2 sino el complemento del uno de 2).

Ahora, ya que los números se almacenan como complemento de 2 (tomando el complemento de uno de un número más uno), por lo que para mostrar este número binario, 1111 1101, en decimal, primero necesitamos encontrar su complemento de 2, que será:

1111 1101 → 0000 0010 + 1 → 0000 0011

Estos son los 2 complementar. La representación decimal del número binario, 0000 0011, es 3. Y, dado que el bit de signo era uno como se mencionó anteriormente, por lo que la respuesta resultante es -3.

Pista: Si usted lee este procedimiento cuidadosamente, entonces usted habría 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.

 3
Author: Himanshu Aggarwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-04 18:40:10

Simplemente ...........

Como complemento de 2 de cualquier número podemos calcular invirtiendo todos los 1s a 0 y viceversa que agregamos 1 a él..

Aquí N = ~N produce resultados - (N+1) siempre. Porque el sistema almacena datos en forma de complemento de 2, lo que significa que almacena ~N de esta manera.

  ~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 Menos. Mi opinión es supongamos que tenemos registro de 32 bits que significa 2^31 -1 bits involucrados en la operación y descansar un poco que cambio en el cálculo anterior (complemento) almacenado como bit de signo que es 1 por lo general. Y obtenemos el resultado como ~10 = -11.

~(-11) =10 ;

Lo anterior es cierto si printf ("%d",~0); obtenemos el resultado: -1;

Pero printf("%u",~0) que resultado: 4294967295 en máquina de 32 bits.

 2
Author: shubham kumar Mishra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-29 09:52:31

El operador de complemento bit a bit(~) es un operador unario.

Funciona según los siguientes métodos

Primero convierte el número decimal dado a su correspondiente binario valor.Es decir, en el caso de 2, primero convierte 2 a 0000 0010 (a un número binario de 8 bits).

Entonces convierte todo el 1 en el número a 0,y todos los ceros a 1;entonces el número se convertirá en 1111 1101.

Esa es la representación del complemento 2 de -3.

En para encontrar el valor sin signo usando complemento, es decir, simplemente para convertir 1111 1101 a decimal (=4294967293) podemos simplemente usar el %u durante la impresión.

 1
Author: james.bondu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-18 10:36:22

Creo que para la mayoría de la gente la parte de confusión proviene de la diferencia entre el número decimal y el número binario firmado, así que aclaremos primero:

Para el mundo decimal humano: 01 significa 1, -01 significa -1, para el mundo binario del ordenador: 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 es un bit invertido= ~2 = ~(010) = 101 = -4 + 1 = -3 la confusión proviene de mezclar el resultado firmado (101=-3) y el no alineado resultado (101=5)

 1
Author: user7537910,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-09 04:16:24

Primero tenemos que dividir el dígito dado en sus dígitos binarios y luego invertirlo agregando en el último dígito binario.Después de esta ejecución tenemos que dar signo opuesto al dígito anterior que estamos encontrando el complent ~2=-3 Explicacion: 2s forma binaria es 00000010 cambios a 11111101 esto es un complemento, luego complented 00000010+1 = 00000011 que es la forma binaria de tres y con-signo Es decir, -3

 0
Author: balusabavath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-11 15:47:24

El operador bit-wise es un operador unario que trabaja en el método de signo y magnitud según mi experiencia y conocimiento.

Por ejemplo ~2 resultaría en -3.

Esto se debe a que el operador en 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 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.

Más tarde agrega un 1 al LSB (1000 0010 + 1) que le da 1000 0011.

Que es -3.

 0
Author: Santhosh Kumar Jhadav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-27 18:40:50

La tilde de Javascript ( ~ ) coacciona un valor dado al complemento de uno all todos los bits se invierten. Eso es todo lo que Tilde hace. No es un signo de obstinación. No suma ni resta ninguna cantidad.

0 -> 1
1 -> 0
...in every bit position [0...integer nbr of bits - 1]

En procesadores de escritorio estándar que utilizan lenguajes de alto nivel como JavaScript, la aritmética firmada BASE10 es la más común, pero tenga en cuenta que no es la única. Los bits a nivel de CPU están sujetos a interpretación basada en una serie de factores. A nivel de "código", en este caso JavaScript, se interpretan como un entero con signo de 32 bits por definición (dejemos los flotadores fuera de esto). Piénsalo como cuántico, esos 32 bits representan muchos valores posibles a la vez. Depende completamente de la lente de conversión a través de la que los vea.

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.

 0
Author: Elvn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-30 14:51:02