2010-12-02 8 views
5

Umkehren i zuerst möchte eine Zahl in das Binärformat zu konvertieren, dann invertieren bitweise .. wie folgt aus:Javascript einen binären Wert einer Zahl

Nummer 793 = 1100011001 dann in den binären Wert umwandeln: 0011100110

in Javascript kann ich folgendes tun:

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

das gibt mir den binären Wert der Zahl .. aber wie invertieren i die binäre bitweise?

habe ich versucht, den Operator ~, aber nicht wahrscheinlich arbeiten ... die Ausgabe ist: -1100011010

jede mögliche Hilfe? Dank im Voraus

Antwort

0

aktualisieren

Es ist mir unklar, ob Sie eine Zeichenfolge mit dem invertierten Wert wollen, wenn so können Sie dies tun:

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' 

Dies wird auch führende Nullen erhalten.

+0

Ich verstehe nicht, wie dies die Frage beantwortet, weil XOR-Verknüpfung mit 0 tut ** nicht ** jede Änderung Bits, wie Sie gezeigt haben. –

+0

@Greg Ah, Gehirn Lag Entschuldigung kopierte das falsche Zeug aus meiner Shell, werde es beheben –

+0

xor'ing ein Element mit 0 tut nichts – 6502

4

Sie möchten den Binärwert mit 111111111 XOR - aber viele 1s wie es Ziffern im Original gibt. Also:

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

(-Code für str_repeat von PHP.JS genommen)

Neubetrachtung Jahre später versuchen:

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

Ich glaube, dies effizienter sein wird ... wahrscheinlich. Könnte völlig falsch sein. Naja.

+0

Hi Kolink, es funktioniert super ... vielen Dank – testjavascript

+0

Sie können auch registrieren das ist eine Prototyp-Funktion, wenn Sie es viel verwenden werden: 'Number.prototype.negate = function() {return this^parseInt ((neues Array (this.toString (2) .length + 1)). join ("1"), 2);}; '- Auf diese Weise können Sie' var x = 793; var c = x.negate(); ' –

+0

GROSSE IDEE BIG THX !! – testjavascript

5

Sie müssen eine Bitmaske verwenden.

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

Oder mit XOR

793^0x3ff 
8

Antwort MooGoo ist korrekt.

Hier sind einige Informationen darüber, was passiert .... Nehmen wir an, dies ist eine 64-Bit-Ganzzahl.

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

So könnten Sie tun dies für alle Fälle mit diesem Code zu lösen:

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

es wäre egal, wenn ich mich richtig erinnere alles in Javascript ist 64bit unter der Decke. das Ergebnis, ob es 32bit oder 64bit ist, wird unabhängig davon der gleiche Wert sein. Ich habe gerade 64 Bit benutzt, um zu demonstrieren, was der negative Wert wirklich binär ist. Da das "-" nicht in binär vorhanden ist, versucht Javascript aber nett zu sein, wenn es das negative Vorzeichen auf der Zahl zeigt. Ist das sinnvoll? Ich bin nicht so gut darin, es zu erklären. Der Unterschied zu meiner Lösung ist, dass alles mathematisch ist. Das y- und yl-Stück kann auch vereinfacht werden, ich hatte einfach nicht die Zeit, mich darauf einzulassen –

Verwandte Themen