Javascript: konvertieren (hex) - Ganzzahl mit Vorzeichen in einen javascript-Wert
Habe ich eine signierte Wert als hex-Zahl, durch Beispiel 0xffeb
und möchten, konvertieren Sie es in -21
als eine "normale" Javascript-integer.
Ich geschrieben habe einige code so weit:
function toBinary(a) { //: String
var r = '';
var binCounter = 0;
while (a > 0) {
r = a%2 + r;
a = Math.floor(a/2);
}
return r;
}
function twoscompl(a) { //: int
var l = toBinaryFill(a).length;
var msb = a >>> (l-1);
if (msb == 0) {
return a;
}
a = a-1;
var str = toBinary(a);
var nstr = '';
for (var i = 0; i < str.length; i++) {
nstr += str.charAt(i) == '1' ? '0' : '1';
}
return (-1)*parseInt(nstr);
}
Das problem ist, dass meine Funktion gibt 1 zurück, als MSB für beide zahlen, weil nur an der MSB, der die binäre Darstellung "string" gesucht. Und für diesen Fall die beiden zahlen sind 1:
-21 => 0xffeb => 1111 1111 1110 1011
21 => 0x15 => 1 0101
Haben Sie eine Idee zu implementieren, diese effizienter und schöner?
Grüße,
mythbu
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
parseInt()
zu konvertieren (die nur akzeptiert Ihre hex-Zeichenfolge):Dann eine Maske verwenden, um herauszufinden, ob das MSB gesetzt ist:
Wenn, dass gibt einen Wert ungleich null, wissen Sie, es ist negativ.
Wrap it all up:
Beachten Sie, dass dies nur für 16-bit-Ganzzahlen (
short
in C). Wenn Sie eine 32-bit-Ganzzahl, müssen Sie eine andere Maske und Subtraktion.0x10000
parseInt
Sie wahrscheinlich verwenden wollenparseInt(a, 16)
parseInt("0xffeb")
analysiert richtig. Wenn das weglassen der0x
, braucht es das radix. Um sicher zu sein, sollten immer Hinzugefügt werden. Ich aktualisiert meine Antwort.parseInt
funktioniert auf normalen int-strings, ohne es als gut...es sei denn, Sie versehentlich schlechtes Eingang (wie erwartet radix 10 Analyse, aber das "012" aus welchem Grund auch immer) und immer10
. Es scheint ein browser-Konsistenz Ding auch. Ich habe gerade festgestellt, es besser, immer liefern die Basis, auch wenn Sie arbeiten, auf dem "normalen" base-10. Wollte nur zeigen Sie es allen aus 🙂Ich kam mit dieser
Und Verwendung:
Also im Grunde das hex conversion-Reichweite hängt von der hex die Länge, ant-dies ist das, was ich suchte. Hoffe, es hilft.
ersten für Ganzzahl-und
die zweite für unsigned integer
Basierend auf @Bart Friederichs bin ich gekommen mit:
so können Sie jetzt geben Sie die genaue Länge (in nibbles).