Нахождение ошибки в этом java-коде для правильного циклического сдвига (кодильность)

#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 .