2014-03-26 65 views
6

我使用的是Oracle的Java 7.51在Ubuntu 12.04,並試圖做到這一點位異或Java的長

long a = 0x0000000080000001^0x4065DE839A6F89EEL; 
System.out.println("result "+ Long.toHexString(a)); 

Output: result bf9a217c1a6f89ef 

但我期待的結果是4065de831a6f89ef,因爲^操作是Java中的按位異或。我閱讀Java規範的哪一部分是錯誤的?

回答

16

你需要一個L在第一整數文字的末尾:

long a = 0x0000000080000001L^0x4065DE839A6F89EEL; 

否則,它是一個int文字,而不是long(前導零被忽略)。然後^運算符將第一個操作數值從0x80000001提升到long,但由於符號位已設置,所以升級的結果爲0xFFFFFFFF80000001L。

+0

謝謝你的解釋。由於Eclipse沒有標記我沒有在第一個字面值中放置尾隨L,所以我想我是綠色的。 – Soham

+1

@索姆 - 是的,你必須小心那些領先的零;它們對我們人類意味着比對Java編譯器更多:) –