Java 黑客攻击挑战

Java 黑客攻击挑战,java,bit-manipulation,unary-operator,Java,Bit Manipulation,Unary Operator,大多数人可能熟悉这个问题,但对于那些不熟悉的人: 给定32位无符号整数,翻转其位并打印结果整数 我希望有人能教我如何用Java解决这个问题。现在我通常会提供一些我尝试过的代码,但它太乱了,不得不删除。我试着看了一下社论,社论建议使用按位~运算符,但没有提供所需的输入。示例输入/输出是 输入: 3 (this is just the number of the integers that we are given) 2147483647 1 0 输出: 2147483648 4294967

大多数人可能熟悉这个问题,但对于那些不熟悉的人:

给定32位无符号整数,翻转其位并打印结果整数

我希望有人能教我如何用Java解决这个问题。现在我通常会提供一些我尝试过的代码,但它太乱了,不得不删除。我试着看了一下社论,社论建议使用按位
~
运算符,但没有提供所需的输入。示例输入/输出是

输入:

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.biginger.flipBit(int n)返回一个biginger,其值与指定位翻转后的这个biginger相等

  // 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
value总是有符号的

但由于“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);

非常感谢你!我似乎忘记了int值是有符号的。