2010-12-02 32 views
5

je voudrais tout d'abord convertir un nombre en binaire, puis l'inverser .. bitwise comme ceci:javascript inversion d'une valeur binaire d'un nombre

Numéro

est 793 = 1100011001 puis convertir la valeur binaire en: 0011100110

en javascript je peux faire ce qui suit:

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

cela me donnera la valeur binaire du nombre .. mais comment puis-je inverser le binaire bit?

i essayé l'opérateur ~, mais ne fonctionne pas sans doute ... la sortie est: -1100011010

d'aide? merci à l'avance

Répondre

0

Mise à jour

On ne sait pas pour moi si vous voulez une chaîne de la valeur inversée, le cas échéant, vous pouvez le faire:

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' 

Cela permettra également de préserver des zéros à gauche.

+0

Je ne comprends pas comment cela répond à la question, parce XOR avec 0 ne ** pas ** modifier les bits, comme vous l'avez démontré. –

+0

@Greg Ah, brain lag désolé copié les mauvaises choses de mon shell, va le réparer –

+0

xor'ing un élément avec 0 ne fait rien – 6502

4

Vous voulez XOR la ​​valeur binaire avec 111111111 - cependant beaucoup 1s comme il y a des chiffres dans l'original. Alors:

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

(Code pour str_repeat pris de PHP.JS)

Revisiter ans plus tard, essayez:

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

Je crois que ce sera plus efficace ... probablement. Peut être complètement faux. Tant pis.

+0

Salut Kolink, ça marche super ... merci beaucoup – testjavascript

+0

Vous pouvez aussi vous inscrire c'est une fonction prototype, si vous allez l'utiliser beaucoup: 'Number.prototype.negate = function() {return this^parseInt ((new Array (this.toString (2) .length + 1)). join ("1"), 2);}; '- De cette façon vous pouvez avoir' var x = 793; var c = x.nier(); ' –

+0

GRANDE IDÉE GRAND THX !! – testjavascript

5

Vous devez utiliser un masque de bits.

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

Ou avec XOR

793^0x3ff 
8

réponse de MooGoo est correcte.

Voici quelques informations sur ce qui se passe .... Supposons qu'il s'agit d'un entier de 64 bits.

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

Vous pouvez le faire pour résoudre tous les cas avec ce code:

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

ce ne serait pas grave, si je me souviens bien tout en javascript est 64bit sous les couvertures. le résultat que ce soit 32bit ou 64bit sera la même valeur indépendamment. J'ai juste utilisé 64 bits afin que je puisse démontrer ce que la valeur négative était vraiment en binaire. Depuis le "-" n'existe pas en binaire, mais javascript essaie d'être gentil quand il montre le signe négatif sur le nombre. Cela a-t-il du sens? Je ne suis pas très doué pour l'expliquer. La différence avec la solution que j'ai posté est tout mathématique. La pièce y et yl peut aussi être simplifiée, je n'ai pas eu le temps d'y entrer –