Получение десятичного числа из двоичного числа со знаком 2 - PullRequest
4 голосов
/ 18 февраля 2020

Я пытаюсь получить десятичное число для дополнения двоичного числа со знаком 2, если оно доступно для того же.

Вот как я пытаюсь это сделать.

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

Ввод : ['10100100', '11100001', '11001', '100000', '100001', '101010', '1000111', '11011000', '1010011', '1011000', '10111011', '10000110', '10111010', '1110101', '1111', '110111']

Выход : [-92, -31, 25, 32, 33, 42, 71, -40, 83, 88, -69, -122, -70, 117, 15, 55 ]

Что на самом деле я получаю [-92, -31, -7, -32, -31, -22, -57, -40, -45, -40, - 69, -122, -70, -11, -1, -9]

1 Ответ

4 голосов
/ 18 февраля 2020

Вы можете добавить проверку значения, у которого в первом бите есть знаковый бит, и принять либо

  • дельту проанализированного значения и 256, либо
  • проанализированное число .

function getSignedInteger(bits) {
    var value = parseInt(bits, 2);
    return value & (1 << 7)
        ? value - (1 << 8)
        : value;
}
console.log(...['10100100', '11100001', '11001', '100000', '100001', '101010', '1000111', '11011000', '1010011', '1011000', '10111011', '10000110', '10111010', '1110101', '1111', '110111'].map(getSignedInteger));
...