2010-12-02 41 views
5

me gustaría primero en convertir un número binario, y luego invertirlo bit a bit .. así:Javascript invirtiendo un valor binario de un número

número es 793 = 1100011001 luego convertir el valor binario en: 0011100110

en javascript que pueda hacer lo siguiente:

var x = 793; 
document.write(x.toString(2)); // gives 0011100110 

esto me dará el valor binario del número .. pero ¿cómo puedo invertir el bit a bit binario?

probé el operador ~, pero no funciona, probablemente ... la salida es: -1100011010

ayuda? gracias de antemano

Respuesta

0

actualización

Es claro para mí si desea una cadena del valor invertido, si es así usted puede hacer esto:

function invert(x){ 
    var e = x.toString(2).split(''); 
    for(var i = 0, l = e.length; i < l; i++) { 
     e[i] = e[i] === '0' ? '1' : (e[i] === '1' ? '0' : e[i]); 
    } 
    return e.join(''); 
} 
invert(793); // '0011100110' 
invert(-793); // '-0011100110' 

Esto también va a conservar ceros.

+0

No entiendo cómo esto responde a la pregunta, porque XORing con 0 hace ** ** no cambiar cualquiera bits, como lo demostró. –

+0

@Greg Ah, lag del cerebro siento haber copiado las cosas incorrectas de mi caparazón, voy a arreglarlo –

+0

xor'ing un elemento con 0 no hace nada – 6502

4

Desea XOR el valor binario con 111111111, independientemente de cuántos dígitos haya en el original. Por lo tanto:

var x = 793; 
var result = x^parseInt((new Array(x.toString(2).length+1)).join("1"),2); 

(Código de str_repeat tomado de PHP.JS)

años Revisitando después, probar:

var x = 793; 
var result = parseInt(x.toString(2).replace(/[01]/g,function(n) {return 1-n;}),2); 

Creo que esto será más eficiente ... probablemente. Podría estar completamente equivocado Oh bien.

+0

hola Kolink, funciona genial ... muchas gracias – testjavascript

+0

También puede registrar que se trata de una función de prototipo, si va a utilizarla mucho: 'Number.prototype.negate = function() {return this^parseInt ((new Array (this.toString (2) .length + 1)). join ("1"), 2);}; '- De esta manera puede tener' var x = 793; var c = x.negate(); ' –

+0

GRAN IDEA GRAN THX !! – testjavascript

5

Necesita una máscara de bits.

(~793 & 0x3ff).toString(2) //11100110 

O XOR con

793^0x3ff 
8

respuesta de MooGoo es correcta.

Aquí hay información sobre lo que está sucediendo ... Supongamos que se trata de un número entero de 64 bits.

793 = 1100011001 
~793 = -794 = 1111111111111111111111111111111111111111111111111111110011100110 
0x3ff = 1111111111 
(-793 & 0x3ff) = 11100110 

por lo que podría hacer esto para resolver todos los casos con este código:

var x = 793; // input value 
var y = x.toString(2); 
var yl = y.length; 
var mask = (Math.pow(2,yl)-1); // calculate mask 
var result = ~x & mask; 
document.write(result.toString(2)+"<br/>"); 
+0

no importaría, si mal no recuerdo todo en javascript es de 64 bits bajo las sábanas. el resultado sea 32bit o 64bit será el mismo valor independientemente. Solo usé 64 bit para poder demostrar cuál era realmente el valor negativo en binario. Como "-" no existe en binario, javascript intenta ser bueno cuando muestra el signo negativo en el número. ¿Tiene sentido? No soy tan bueno para explicarlo. La diferencia con la solución que he publicado es que todo es matemático. La pieza yy yl se puede simplificar también, simplemente no tuve el tiempo para entrar en ella –

Cuestiones relacionadas