Преобразовать десятичное число со знаком в шестнадцатеричное, закодированное с дополнением до двух - PullRequest
11 голосов
/ 27 мая 2011

Мне нужно закодировать целое число со знаком как шестнадцатеричное, используя нотацию дополнения до двух. Например я хотел бы конвертировать

e.g. -24375 to 0xffffa0c9.

До сих пор я работал над следующими строками:

parseInt(-24375).toString(2)
> "-101111100110111"    

Это соответствует отображению Wolfram Alpha , но я не уверен, как добраться до 24-битного представления числа со знаком (ffffa0c9).

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

~ parseInt("101111100110111", 2) + 1
> -23475

но я не уверен, что двоичное представление этого числа нужно преобразовать в шестнадцатеричное.

Есть идеи?

1 Ответ

1 голос
/ 25 марта 2019

Для создания двух комплиментарных чисел фиксированного размера я создал фабричный метод:

 function createToInt(size) {
    if (size < 2) {
        throw new Error('Minimum size is 2');
    }
    else if (size > 64) {
        throw new Error('Maximum size is 64');
    }

    // Determine value range
    const maxValue = (1 << (size - 1)) - 1;
    const minValue = -maxValue - 1;

    return (value) => {
        if (value > maxValue || value < minValue) {
            throw new Error(`Int${size} overflow`);
        }

        if (value < 0) {
            return (1 << size) + value;
        }
        else {
            return value;
        }
    };
}

Теперь, чтобы решить свой вопрос, вы можете создать функции toInt8, toInt16, toInt32,и т. д. И используйте его для преобразования чисел JS в комплимент двоим.Пример с int8:

const toInt8 = createToInt(8);

'0x' + toInt8(-128).toString(16); // -> 0x80
'0x' + toInt8(127).toString(16); // -> 0x7f
'0x' + toInt8(-1).toString(16); // -> 0xff

// Values less then 16 should be padded
'0x' + toInt8(10).toString(16).padStart(2, '0); // -> 0x0a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...