Hackkerrank BitFlipping挑战赛

时间:2015-05-22 17:19:24

标签: java bit-manipulation unary-operator

大多数人可能对此问题很熟悉,但对于那些不是:

  

给定32位无符号整数翻转它们的位并打印生成的整数。

我希望有人可以给我一些如何在Java中解决这个问题的线索。现在我通常会提供一些我已经尝试过的代码,但它是如此混乱,必须删除它。我试着查看编辑,它建议使用按位~运算符,但是没有提供所需的输入。示例输入/输出是

输入:

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

输出:

2147483648 
4294967294 
4294967295

P.S任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:1)

真的让所有人失败

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 :(得分:1)

~运算符没有任何问题。它会翻转位。您必须要了解的是,在Java中,int值始终是签名

但由于“无符号”只是对位的解释,因此必须将它们打印为无符号值,例如:使用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);

答案 2 :(得分:0)

简单的解决方案: 你需要翻转位。 1变为0. 0变为1.什么时候发生?

1 xor 1 = 0
1 xor 0 = 1

所以,任何数字xor ff都应该给你答案。

答案 3 :(得分:0)

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