Foros del Web » Programando para Internet » Javascript »

Duda del Operador NOT(~) a Nivel Bit(bitwise)

Estas en el tema de Duda del Operador NOT(~) a Nivel Bit(bitwise) en el foro de Javascript en Foros del Web. Hola buenos días. Tengo duda del porque al usar el operador de nagación NOT(~) me retorna el mísmo número en negativo - 1, no entiendo ...
  #1 (permalink)  
Antiguo 11/08/2011, 13:43
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 12 años, 9 meses
Puntos: 32
Pregunta Duda del Operador NOT(~) a Nivel Bit(bitwise)

Hola buenos días.

Tengo duda del porque al usar el operador de nagación NOT(~) me retorna el mísmo número en negativo - 1, no entiendo la lógica del resultado ~N = -N-1.

Ejemplo:

Código Javascript:
Ver original
  1. var byte1 = 255; // 11111111
  2. var byte2 = 9; // 00001001
  3. var extracion = ~byte2; // 11110110 y en vez de retornar 246 retorna ¿-10?
  4.  
  5. byte1 &= extraccion;
  6.                                   // 11111111 &
  7.                                   // 11110110
  8.                                   // ----------
  9.                                   // 11110110 = 246
  10.  
  11. // funciona perfectamente pero no entiendo el resultado de ~N = -N-1

No tengo problemas para usar estos operadores pero es un capricho que tengo con ese operador hehe, espero respuesta.
Gracias y saludos.

Última edición por IXtremeLT; 11/08/2011 a las 13:49
  #2 (permalink)  
Antiguo 11/08/2011, 14:45
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Duda del Operador NOT(~) a Nivel Bit(bitwise)

lo que hace es ir restando
Cita:
1 ---1 --1 ---1 -0 -1 -1 -0
128 -64 -32 -16 -0 -4 -2 -0 = 10
  #3 (permalink)  
Antiguo 11/08/2011, 14:49
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 19 años, 11 meses
Puntos: 834
Respuesta: Duda del Operador NOT(~) a Nivel Bit(bitwise)

Para entender el funcionamiento tenés que leer acerca de complemento a dos:
http://es.wikipedia.org/wiki/Complemento_a_dos
  #4 (permalink)  
Antiguo 11/08/2011, 15:19
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 12 años, 9 meses
Puntos: 32
Respuesta: Duda del Operador NOT(~) a Nivel Bit(bitwise)

Hola, gracias ya pobré con las dos respuestas y no logré hacer que ~9 sea igual a -10 y sigo sin comprenderlo, ni usando complemento a dos. Estaría mejor si escriben con sus propias palabras un pequeño ejemplo del por que:
~N = -N - 1
  #5 (permalink)  
Antiguo 11/08/2011, 19:53
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 12 años, 11 meses
Puntos: 343
Respuesta: Duda del Operador NOT(~) a Nivel Bit(bitwise)

Alguien usa los operadores binarios para algo mas que un bitmask?
__________________
blog | @aijoona
  #6 (permalink)  
Antiguo 11/08/2011, 21:01
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 12 años, 9 meses
Puntos: 32
Respuesta: Duda del Operador NOT(~) a Nivel Bit(bitwise)

Pues yo creo que un bitmask no es poca cosa, parecen ser muy muy útiles, aunque también he visto el uso de estos operadores para hacer gráficos y animaciones muy agradables.
Bueno, en fín, alguien puede responder mi duda del porque

¿¿¿ ~N = -N -1 ????

con ejemplo,

grax.
  #7 (permalink)  
Antiguo 11/08/2011, 22:09
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 19 años, 11 meses
Puntos: 834
Respuesta: Duda del Operador NOT(~) a Nivel Bit(bitwise)

El ejemplo que puedo darte es este:
Código PHP:
<script type="text/javascript">
var 
a=5;
var 
b=~a;//-6
alert(b);
alert(~b);//5
</script> 
Pero eso no aclara demasiado.
Los números son infinitos y por lo tanto, es imposible que un sistema finito pueda representarlos. Lo que se intenta, mediante diversos mecanismos, es ampliar lo más posible el conjunto a representar.
Javascript, con esa misma finalidad, usa para representar los números negativos un sistema de representación que se llama Código binario en complemento a dos.
Los números positivos se representan como ya sabés. Pero los negativos, en cambio, se representan cambiando los bits en 1 por cero y viceversa y sumándole un uno al resultado.
Cuando usás el operador not con un número positivo no estás obteniendo un número positivo. Lo que estás obteniendo es el complemento a 1 de ese número, que en realidad corresponde a la representación de un número negativo.

Última edición por Panino5001; 11/08/2011 a las 22:35
  #8 (permalink)  
Antiguo 11/08/2011, 23:42
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 12 años, 9 meses
Puntos: 32
Respuesta: Duda del Operador NOT(~) a Nivel Bit(bitwise)

Gracias papino, en realidad seguía con la duda pero tu ejemplo me hizo hacer pruebas con la consola web y logré entenderlo.

Yo logré aplicar el complemento a dos(Cn2) haciendolo así:
Se invierten los bit (0=1,1=0) después del primer 1 de derecha a izquierda.
Ej.
10110 = 01010

Se toma en cuenta que cuando el número está en negativo(en el caso de JS) quiere decir que está complementado a dos y para revertirlo se vuelve a aplicar el complemento a dos de la mísma forma.
Ej.
-16 en bin es 10000, entonces se revierte usando Cn2, que es igual a 10000, es notable que no se modificó nada porque el primer 1 estaba hasta la izquierda. Y así ya está listo para negarlo normalmente, que sería 01111 que en decimal es 15.

Los pasos para los números positivos es:
Cita:
1. Convertir a binario normalmente.
2. Aplicar la negación normalmente.
3. Aplicar el complemento a dos (negar désde el primer 1 de der. a izq).
4. Convertir a valor décimal con signo negativo.
Los pasos para los números negativos es:
Cita:
1. Convertir a binario normalmente.
2. Aplicar el complemento a dos (negar désde el primer 1 de der. a izq).
3. Aplicar la negación normalmente.
4. Convertir a valor décimal con signo positivo.
Otros ejemplos.
Ejemplo con número positivo:
~23 = ~10111(paso 1) = 01000(paso 2) = 11000(paso 3) = -24 (paso 4)

Ejemplo con número negativo:
~-18 = ~10010(paso 1) = 01110(paso 2) = 10001(paso 3) = 17(paso 4)

Bueno espero que le sirva a alguien más que tenga la mísma duda. Saludos.

Última edición por IXtremeLT; 12/08/2011 a las 00:04
  #9 (permalink)  
Antiguo 12/08/2011, 00:04
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 19 años, 11 meses
Puntos: 834
Respuesta: Duda del Operador NOT(~) a Nivel Bit(bitwise)

Me alegra que te haya servido. Un uso habitual de not es usarlo (doble) como reemplazo resumido de Math.floor:
Código PHP:
<script type="text/javascript">
var 
a=3.1416;
var 
b=Math.floor(a);
var 
c=~~a;
alert(b===c);//true
</script> 
  #10 (permalink)  
Antiguo 14/08/2011, 12:07
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 19 años, 11 meses
Puntos: 834
Respuesta: Duda del Operador NOT(~) a Nivel Bit(bitwise)

Cita:
Iniciado por Aijoona Ver Mensaje
Alguien usa los operadores binarios para algo mas que un bitmask?
Un par de buenos ejemplos:
http://p4wn.sourceforge.net/sven/
http://www.cristalab.com/tutoriales/...cript-2-c234l/
  #11 (permalink)  
Antiguo 15/08/2011, 11:48
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 12 años, 11 meses
Puntos: 343
Respuesta: Duda del Operador NOT(~) a Nivel Bit(bitwise)

Y... digamos que jamas me propuse resolver un sudoku! :D

Gracias por el aporte.
__________________
blog | @aijoona

Etiquetas: bitwise_not, negacion_bit, operador_not
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 16:00.