#java #integer
Вопрос:
Недавно у меня возникла проблема с кодировкой, в которой говорится, что в следующем коде есть ошибка.
Итак, проблема с кодом заключается в том, что у нас есть 30-битное целое N[29]... N[0]
число без знака, и выполнение правильного циклического сдвига (>>>) должно дать нам число, подобное >> N[0]N[29]... N[1]
.
Наша цель состоит в том, чтобы найти количество правильных сдвигов, которые дают максимальное значение, достижимое из заданного числа.
Например:
для n = 9736 (00 0000 0000 0000 0010 0110 0000 1000)
9736 >> 1 = 4868 -> 00 0000 0000 0000 0001 0011 0000 0100
.
.
.
9736 >> 11 = 809500676 -> 11 0000 0100 0000 0000 0000 0000 0100
.
.
до 30 (как мы уже 30 бит целых чисел)
из приведенного выше примера на 11-й итерации мы получаем максимально возможное число для 9736. Следовательно, ответ = 11
Данный Код:
int shift(int N) {
int largest = 0;
int shift = 0;
int temp = N;
for (int i = 1; i < 30; i) {
int index = (temp amp; 1);
temp = ((temp >> 1) | (index << 29));
if (temp > largest) {
largest = temp;
shift = i;
}
}
return shift;
}
N находится в диапазоне [0… 1,073,741,823]
Я пытался, но не смог найти здесь ошибку или тестовый случай, в котором это не удается.
Комментарии:
1. Это не » сдвиг вправо (>>>)», это «>> поворот «.
Ответ №1:
Это не удается для 0b10000...000
( 0x20000000
), потому что наибольшее значение для shift
==0
самое простое решение-определить largest
как N
вместо 0
.