Javascript: преобразование (шестнадцатеричного) целого числа со знаком в значение javascript
у меня есть знаковое значение, заданное как шестнадцатеричное число, например 0xffeb
и хотите преобразовать его в -21
как" нормальное " целое число Javascript.
Я написал некоторый код до сих пор:
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);
}
проблема в том, что моя функция возвращает 1 Как MSB для обоих чисел, потому что только в MSB двоичного представления просматривается "строка". И для этого случая оба числа равны 1:
-21 => 0xffeb => 1111 1111 1110 1011
21 => 0x15 => 1 0101
есть ли у вас идея реализовать это более эффективно и приятнее?
приветы, mythbu
3 ответов
использовать parseInt()
для преобразования (который просто принимает вашу шестнадцатеричную строку):
parseInt(a);
затем используйте маску, чтобы выяснить, установлен ли MSB:
a & 0x8000
если это возвращает ненулевое значение, вы знаете, он отрицательный.
чтобы завернуть все это:
a = "0xffeb";
a = parseInt(a, 16);
if ((a & 0x8000) > 0) {
a = a - 0x10000;
}
обратите внимание, что это работает только для 16-битных целых чисел (short
в C). Если у вас есть 32-разрядное целое число, вам понадобится другая маска и вычитание.
Я придумал это
function hexToInt(hex) {
if (hex.length % 2 != 0) {
hex = "0" + hex;
}
var num = parseInt(hex, 16);
var maxVal = Math.pow(2, hex.length / 2 * 8);
if (num > maxVal / 2 - 1) {
num = num - maxVal
}
return num;
}
и использование:
var res = hexToInt("FF"); // -1
res = hexToInt("A"); // same as "0A", 10
res = hexToInt("FFF"); // same as "0FFF", 4095
res = hexToInt("FFFF"); // -1
таким образом, в основном диапазон преобразования hex зависит от длины hex, ant это то, что я искал. Надеюсь, это поможет.
function hexToSignedInt(hex) {
if (hex.length % 2 != 0) {
hex = "0" + hex;
}
var num = parseInt(hex, 16);
var maxVal = Math.pow(2, hex.length / 2 * 8);
if (num > maxVal / 2 - 1) {
num = num - maxVal
}
return num;
}
function hexToUnsignedInt(hex){
return parseInt(hex,16);
}
первый для целого числа со знаком и второе для целого числа без знака