Это из-за проблемы с хакерской раной (не конкуренция) 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, вот что я получил, когда я отлаживал код
Я попытался выполнить тестовый прогон со входом 0. После первого запуска (k = 31) я как-то получаю отрицательное число. Кто-нибудь знает, в чем проблема или как я могу это исправить?
Я также убедился в том, что я использовал операторы правого сдвига, от того, как работают операторы сдвига на Java?
Ваша первая итерация меняет самый левый бит от 0 до 1. Это знаковый бит, поэтому, конечно, вы получили отрицательное число.
РЕДАКТИРОВАТЬ:
изменение
evaluateBit = (c >> k);
в
evaluateBit = (c >> k) & 1;
Для того, чтобы valueBit действительно содержал значение одного бита.