Hackerrank 位翻转挑战
Hackkerrank BitFlipping Challenge
大多数人可能都熟悉这个问题,但对于那些不熟悉的人:
Given 32-bit unsigned integers flip their bits and print the resulting integers.
我希望有人能在 Java 中告诉我如何解决这个问题。现在我通常会提供一些我试过的代码,但它太乱了,不得不删除。我试着查看社论,它建议使用按位 ~
运算符,但没有提供所需的输入。例子 input/output 是
输入:
3 (this is just the number of the integers that we are given)
2147483647
1
0
输出:
2147483648
4294967294
4294967295
P.S 如有任何帮助,我们将不胜感激。
这确实翻转了所有位
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));
简单的解决方案:
你需要翻转位。 1 变成 0。0 变成 1。什么时候发生?
1 xor 1 = 0
1 xor 0 = 1
所以,任何数字 xor ff
都应该给你答案。
java.math.BigInteger.flipBit(int n) returns 一个 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);
~
运算符没有任何问题。它确实翻转位。您需要了解的是,在 Java 中,int
值始终是 signed.
但由于“无符号”只是位的解释问题,您必须像无符号值一样打印它们,例如使用 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);
大多数人可能都熟悉这个问题,但对于那些不熟悉的人:
Given 32-bit unsigned integers flip their bits and print the resulting integers.
我希望有人能在 Java 中告诉我如何解决这个问题。现在我通常会提供一些我试过的代码,但它太乱了,不得不删除。我试着查看社论,它建议使用按位 ~
运算符,但没有提供所需的输入。例子 input/output 是
输入:
3 (this is just the number of the integers that we are given)
2147483647
1
0
输出:
2147483648
4294967294
4294967295
P.S 如有任何帮助,我们将不胜感激。
这确实翻转了所有位
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));
简单的解决方案: 你需要翻转位。 1 变成 0。0 变成 1。什么时候发生?
1 xor 1 = 0
1 xor 0 = 1
所以,任何数字 xor ff
都应该给你答案。
java.math.BigInteger.flipBit(int n) returns 一个 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);
~
运算符没有任何问题。它确实翻转位。您需要了解的是,在 Java 中,int
值始终是 signed.
但由于“无符号”只是位的解释问题,您必须像无符号值一样打印它们,例如使用 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);