2015-09-09 26 views
-1

我试图解决一个问题,需要我翻转输入的32位无符号整型和打印它的位。为什么我不能通过按位或0来翻转32位无符号整型数据的位?

我第一次尝试做这样的事情解决它:

Scanner scanner = new Scanner(System.in); 
// EDIT System.out.println(~scanner.nextLong() | 0); 
System.out.println(~scanner.nextLong() | 0x00000000L); 

但是这并没有产生正确的答案。

然后,我能够与解决它:

System.out.println(~scanner.nextLong() & 0xFFFFFFFFL); 

有人能向我解释为什么我第一次尝试没有工作?

编辑:澄清了一下代码。

EDIT2:这里的问题是,对于那些谁是纳闷:https://www.hackerrank.com/challenges/flipping-bits

EDIT3:噢,天哪。我真的没有想到这一点。由于长整数的高32位全部从0变为1,并且将该长整数与0进行或运算没有任何作用,所以只有具有值的较低32位会导致负长,而将长整数32个1位将清除该长整数的高32位,只留下长32位的低位。

+0

具有零的按位或不会改变任何内容。你的意思是异或('^')? –

+1

@ChrisMartin,与零异或也不会改变任何东西。 –

+1

在Java中,没有像“32位无符号整数”那样的东西。并且将int与零进行或运算将始终为空操作。 –

回答

1

我相信令你困惑的部分是& 0xFFFFFFFFL是将int作为无符号对待并将其表示为有符号long的一种方法。 | 0什么都不做。从Java 8开始,您也可以使用Integer.toUnsignedStringint转换为无符号32位值的String表示。

+0

感谢您的回答,但您能否解释为什么我无法通过将0x00000000L与长整型,然后用0xFFFFFFFFL工作与长整型来得到正确答案? – Regnarg

+0

或与0结果相同的值 –

+4

请注意,0xFFFFFFFFL不是全部1位。那将是'0xFFFFFFFFFFFFFFFFL'。 (Longs _long._) –

相关问题