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);