Разбор двоичного двоичного числа до десятичного?

Ну, я смущен, это не так просто, как я думал ... Я хочу преобразовать двоичную строку двоичного кода в соответствующее число:

-5 = '11111011' согласно Википедии

Поэтому я бы подумал, что следующее будет возвращать отрицательные 5, но это не так. После прочтения Википедии кажется, что все, что мне нужно сделать, это вычесть одно, а затем инвертировать биты:

~ (parseInt ('11111011', 2) - 1)

Но он возвращает -251. Смешение ...

Обратите внимание, что я буду иметь дело со множеством нечетных длин бит, и все не будут 8 бит.

javascript,encoding,binary,type-conversion,

0

Ответов: 3


0

После некоторого времени работы над этим я создал это решение ... если у вас есть опыт работы с бинарными и побитовыми операциями, пожалуйста, дайте мне знать ваши мысли:

function getSignedInteger(bits) {
    let negative = (bits[0] === '1');
    if (negative) {
        let inverse = '';
        for (let i = 0; i < bits.length; i++) {
            inverse += (bits[i] === '0' ? '1' : '0');
        }
        return (parseInt(inverse, 2) + 1) * -1;
    } else {
        return parseInt(bits, 2);
    }
}

getSignedInteger ('11111011') возвращает -5


0

Я чувствую ваше замешательство. Статья в википедии показывает вам примеры с 8-битными номерами, но вы обычно не имеете дело с 8-битными номерами в javascript. Если вы хотите изучить математику двоичного числа в javascript, вы, вероятно, будете использовать 32 бита и заставляете разговор с 32-битным ints с побитовыми операторами.

Поэтому перевод статьи в википедии даст вам следующее:

-5 будет больше напоминать 11111111111111111111111111111011

Все лишние нули перевернуты. Имея это в виду, это имеет немного больше смысла:

let str = "11111111111111111111111111111011"
console.log(str.length, 'bits')
console.log((parseInt(str, 2) >> 0))

Теперь должно иметь смысл:

let five = '00000000000000000000000000000101'
let neg6 = '11111111111111111111111111111010'

console.log('5: ', parseInt(five, 2) >> 0)
console.log('-6: ', parseInt(neg6, 2) >> 0)

// two complement
let neg6Plus1 = '11111111111111111111111111111011'

console.log('-5: ', parseInt(neg6Plus1, 2) >> 0)


0

Это займет неизвестный бит-шаблон <= 32 бита, и если он <8 бит преобразуется в положительный int, а if> = 8 с ведущим 1, с отрицательной подписью int.

Трюк состоит в том, чтобы отложить до 32 перед parseInt

function getSigned(binStr) {
  binStr = binStr.length>=8 && binStr[0]==="1"?
    binStr.padStart(32,"1"):
    binStr.padStart(32,"0");
  return parseInt(binStr,2) >> 0
}

[
"11111011", // -5
"01111011", // 123
"1111111111000" // -8
].forEach(function(binStr) {
  let signed = getSigned(binStr)
  console.log(signed);
});

JavaScript, кодирование, двоичный, тип преобразования,
Похожие вопросы