Каков мой код для инвертирования всех битов в 32-битном целом числе с неправильным выводом?

1

Это из-за проблемы с хакерской раной (не конкуренция) https://www.hackerrank.com/challenges/flipping-bits. Просто делайте это для практики.
Проблема просто попросит вас принять заданное число для 32-битных целых чисел и для каждого из них, инвертировать все биты внутри этого целого и распечатать результат. Здесь мой код

 static long getComplement(long c) {
    long complement = 0;
    for(int k = 31; k >= 0 ; k --) {
        long evaluateBit = c >> k;
        if(evaluateBit == 1) {
            evaluateBit = 0;
        }  else {
            evaluateBit = 1;
        }
        complement += evaluateBit << k;
     }
    return complement;
}

Вот мое мышление псевдокода высокого уровня. Я буду оценивать каждый бит целого числа. Для этого мне нужно сдвинуть бит по его позиции (то, что было в позиции 31, должно быть сдвинуто на 31, чтобы перейти в позицию 0, чтобы я мог его оценить). Вот почему мой цикл начался с 31 и заканчивается на 0. И затем, как только я получу бит в этой позиции, я инвертирую его с условным выражением, а затем сдвигаю результат влево на тот же результат. Я, наконец, добавлю его к сумме, которую я сохраняю (то, что было 0 * 2 ^ 31, будет состоять из 1 * 2 ^ 31)

Кто-нибудь видит какие-либо проблемы с моим псевдокодом?

Должна быть проблема, потому что, когда я пытался запустить код в своей среде IDE, вот что я получил, когда я отлаживал код Изображение 174551

Я попытался выполнить тестовый прогон со входом 0. После первого запуска (k = 31) я как-то получаю отрицательное число. Кто-нибудь знает, в чем проблема или как я могу это исправить?

Я также убедился в том, что я использовал операторы правого сдвига, от того, как работают операторы сдвига на Java?

  • 0
    Кто-нибудь, пожалуйста, объясните отрицательный голос? Это явно следует за конкретной проблемой программирования из stackoverflow.com/help/on-topic
Теги:
algorithm
bit-manipulation
integer

1 ответ

2
Лучший ответ

Ваша первая итерация меняет самый левый бит от 0 до 1. Это знаковый бит, поэтому, конечно, вы получили отрицательное число.

РЕДАКТИРОВАТЬ:

изменение

evaluateBit = (c >> k);

в

evaluateBit = (c >> k) & 1;

Для того, чтобы valueBit действительно содержал значение одного бита.

  • 0
    Для ввода 0 для этой проблемы я должен получить 4294967295, а не -1.
  • 0
    @committedandroider Это потому, что присваивание специально просит использовать целые числа без знака, но вы используете целые числа со знаком.
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню