2015-09-09 56 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._) –

相關問題