Проблема стандартная, но решение в JavaScript требует гораздо больше усилий для кодирования.
Я получил решение, но мой ответ приходит наполовину от желаемого.
Описание проблемы
Инвертировать биты 32-разрядного целого числа без знака A.
Ограничения задачи
0 <= A < = 2 ^ 32 </p>
Формат ввода
Первый и единственный аргумент ввода содержит целое число A.
Формат вывода
Возвращает единственное целое число без знака, обозначающее минимальное значение xor.
Пример ввода
Input 1:
0
Input 2:
3
Пример вывода
Output 1:
0
Output 2:
3221225472
Мое решение
function modulo(a, b) {
return a - Math.floor(a/b)*b;
}
function ToUint32(x) {
return modulo(parseInt(x), Math.pow(2, 32));
}
function revereBits(A){
A = A.toString(2);
while (A.length < 31){
A = "0"+A;
}
var reverse = 0;
var NO_OF_BITS = A.length;
for(var i = NO_OF_BITS; i >= 1; i--){
var temp = (parseInt(A, 2) & (1 << i - 1));
if(temp){
reverse |= 1 << (NO_OF_BITS - i);
}
}
if( reverse << 1 < 0 ) reverse = ToUint32(reverse << 1);
return reverse;
}
Теперь в строке
if( reverse << 1 < 0 ) reverse = ToUint32(reverse << 1);
Вы видите, что я должен удвоить ответ. Однако я не могу понять, почему это необходимо.
Я выбрал подход из https://www.geeksforgeeks.org/write-an-efficient-c-program-to-reverse-bits-of-a-number/
Пришлось сделать несколько корректировки к нему. Например, запустите l oop от 31 до 1, а не от 0 до 31. Последний дает отрицательные значения в первой операции сдвига влево для самого i = 0.
Может кто-нибудь помочь исправить это решение и указать на проблему в этом?
ОБНОВЛЕНИЕ - Проблема связана с манипулированием битами. Так что, ребята, пожалуйста, не отвечайте и не комментируйте что-либо, состоящее из встроенных строковых функций Javascript. Ура!