Вопрос: Учитывая целое число, напишите алгоритм, чтобы преобразовать его в шестнадцатеричную.
Давайте начнем с каких шестнадцатеричных чисел?
Шестнадцатеричное число – это число, представленное в базе 16, состоит из 16 символов
+--------------------------------------------------------------------+ | Decimal : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | | Hexadecimal : 0 1 2 3 4 5 6 7 8 9 A B C D E F | +--------------------------------------------------------------------+
Чтобы упростить нашу жизнь, давайте создадим массив, который хранит шестнадцатеричные значения для соответствующего десятичного индекса.
let map = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
Обработка положительных чисел
Обработка положительных чисел легко. Это 3 -ступенчатая операция, и она интуитивно понятна:
Шаг 1: Храните результат num%16 Шаг 2: Perfrom num/16 Шаг 3: Выполните шаг 1,2 до Num> 0
let res = "";
while(num > 0) {
let digit = num % 16;
res = arr[digit] + res;
num = Math.floor(num / 16);
}
Обработка негативных целых чисел
Обработка негативных целых чисел становится немного сложным, поскольку мы не можем писать -#3AC, чтобы представлять негативные шестнадцатеричные числа, поэтому давайте погрузимся глубже и представляют цифры в их двоичных формах.
А поскольку любое число придается до бинарного и 1 -го, мы сталкиваемся с той же проблемой представления отрицательных чисел в двоичном формате, поскольку компьютер не понимает -0010.
Таким образом, чтобы решить эту проблему, отрицательные числа представлены путем установки наиболее значительного бита на 1.
Итак, как мы можем использовать эту двух ключевую информацию для решения нашей проблемы? При ближайшем взгляде мы видим это:
Поскольку целое число составляет 32 -битное, которое дополнительно разбито до частей 4 -битных, а двоичное представление чисел 8 – 16 имеет 1 набор в качестве наиболее значимого бита, а 8 – F представляют эти числа, поэтому мы могли бы сказать, что 8 – Диапазон F может быть использован для представления отрицательных чисел.
Таким образом, шестнадцатеричный номер #fffff63c представляет собой отрицательное число.
Всякий раз, когда мы сталкиваемся с номером <0, мы добавляем в него 2^32, чтобы преобразовать в формат, который можно нанести на карту с шестнадцатеричными отображениями.
var toHex = function(num) {
let map = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
if (num == 0) return "0";
if (num < 0) {
num += Math.pow(2,32);
}
let res = "";
while(num > 0) {
let digit = num % 16;
res = map[digit] + res;
num = Math.floor(num / 16);
}
return res;
};
Это был нормальный способ сделать это, теперь давайте посмотрим еще более умный способ достижения того же, который определенно произведет впечатление на вашего интервьюера.
Умнее
Для этого нам нужно понять две основные концепции битовых манипуляций.
& operator 1 & 1 = 1 0 & 0 = 0 0 & 1 = 0 1 & 0 = 0 >>> right shit operator shifts bit's to right 5 >>> 1 = 101 >>> 1 = 10 = 2. Here the number is being shifted right once.
Так что, если мы выполним -14 и 15, -14 и 15, мы получим, и 15, потому что мы хотим преобразовать его в Hex и F Equals 15:
Основываясь на этом, мы можем сказать, что & 15 будут преобразовать отрицательные десятичные значения в соответствующем шестнадцатеричном негативном значении при сохранении положительного десятичного значения.
Теперь все основные основы, эта техника состоит из двух шагов.
Шаг 1> res [num & 15] Шаг 2> num >>> 4. Шаг 3 Повторите шаг 1 и 2 до числа
Мы выполняем шаг 2 похож на дайвинг num/16. Поскольку 15 составляет 1111, т. Е. 4 бита в двоичной форме, мы преобразуем работу «&» и удаляем эти 4 бита.
Преобразование в код:
var toHex = function(num) {
if (num == 0) return '0';
let map = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
let result = '';
while (num != 0) {
let c = map[num & 15]; // map last 4 bits to a hex digit
result = c + result;
num = num >> 4;
}
return result;
};
Надеюсь, вам понравилась моя статья:)
GitHub: https://github.com/akhilp96/data Структуры и algorithms/blob/master/problems/decimaltohex.js
Оригинал: “https://dev.to/akhilpokle/convert-number-to-hexadecimal-solving-a-short-facebook-interview-question-3427”