Hackkerrank BitFlipping Challenge

Большинство, вероятно, знакомы с этой проблемой, но для тех, кто не:

Получив 32-разрядные целые числа без знака, переверните их биты и выведите получающиеся целые числа

Я надеялся, что кто-нибудь может дать мне подсказку, как решить эту проблему на Java. Теперь я обычно предоставляю некоторый код, который я пробовал, но это был такой беспорядок, что его пришлось удалить. Я попытался посмотреть на редакцию, которая предложила использовать побитовое ~ оператор, но это не обеспечило требуемый ввод. Пример ввода / вывода был

Входные данные:

3 (this is just the number of the integers that we are given)
2147483647 
1 
0

Выход:

2147483648 
4294967294 
4294967295

PS Любая помощь будет оценена.

5 ответов

Решение

Там нет ничего плохого в ~ оператор. Это переворачивает биты. Все, что вам нужно понять, это то, что в Java, int значение всегда подписано.

Но поскольку "unsigned" - это только вопрос интерпретации битов, вы должны печатать их как значения без знака, например, используя Java 8:

int[] values={2147483647, 1, 0};
for(int value: values)
    System.out.println(Integer.toUnsignedString(~ value));

распечатает

2147483648
4294967294
4294967295

Если вы не можете использовать Java 8, вы можете помочь себе, преобразовав int значения для long перед печатью:

int[] values={2147483647, 1, 0};
for(int value: values)
    System.out.println((~ value) & 0xFFFFFFFFL);

ДЕЙСТВИТЕЛЬНО ЭТО ПЕРЕКРЫВАЕТ ВСЕ БИТЫ

it is normal that if you flip small number like

    000000000000000001 to inverse bits:
    111111111111111110

результат будет намного большим числом.

int n=~n; // flips all bits to inverse, 1 to 0 and 0 to 1;

если вы хотите иметь только 32 бита, сделайте:

int n=n&0xFFFFFFFF;

Вы можете проверить биты целого числа следующим образом:

int x = 100;
System.out.println(Integer.toBinaryString(x));

Хотел бы поделиться ответом на Котлине, если вдруг кому понадобится :)

      fun flippingBits(n: Long): Long {
    return n.inv() and 0xFFFFFFFFL
}

Простое решение: вам нужно перевернуть биты. 1 становится 0. 0 становится 1. Когда это происходит?

1 xor 1 = 0
1 xor 0 = 1

Итак, любое число xor ff должен дать вам ответ.

Java.math.BigInteger.flipBit(int n) возвращает BigInteger, значение которого эквивалентно этому BigInteger с переключенным назначенным битом

  // create 2 BigInteger objects
BigInteger bi1, bi2;

// assign value to bi1
bi1 = new BigInteger("8");//1000

// perform flipbit operation on bi1 with index 1
bi2 = bi1.flipBit(1);
Другие вопросы по тегам