2012-10-29 61 views
0

我將一些C++代碼移植到Java代碼中。java長數據類型轉換爲無符號值

在java中沒有可以容納64位的無符號數據類型。

我有一個存儲在Java的long數據類型(當然是簽名)的散列碼。

long vp = hashcode/38; // hashcode is of type 'long' 

由於38這裏是大於2,所得到的數目可以被安全地用於java的任何其他運算。

問題是如果'hashcode'中的有符號位設置爲1.我不想在變量vp中獲得負值。我想要一個正值,就好像數據類型是無符號的。

P.S:由於性能問題,我不想使用Biginteger來達到此目的。

+0

我不明白你的問題。請檢查您的拼寫。 –

+0

這是一個二進制補碼64位。 ([spec](http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html)) – ignis

+0

您是否需要獲取C++中的精確值? – EJP

回答

5

Java的初級整數類型被認爲是有符號的,並且實際上沒有什麼可以做的。但是,根據您的需要,這可能無關緊要。

由於整數都用二進制補碼完成,所以在二進制級別有符號和無符號的完全相同。不同的是你如何解釋它們,以及在某些操作中。具體而言,右移,分割,模數和比較不同。無符號右移可以使用>>>運算符完成。只要你不需要失蹤的運營商之一,你就可以很好地使用long

+0

我需要在這種情況下分裂。存儲在我的數據類型中的值可以將帶符號(MSB)位設置爲'1'。有沒有辦法解決這個問題? – user982845

+0

非常感謝Java的不靈活的語法,沒有好辦法做到這一點。然而,有幾種醜陋的方式可以做到這一點。 1)使用bignum類型。 2)使用自定義分割功能 – Antimony

1

如果您可以使用第三方庫,您可以使用番石榴的UnsignedLongs類將long值作爲無符號值用於許多目的,包括除法。 (披露:我貢獻番石榴。)

0

那麼這裏是我如何解決這個問題。向右移位哈希碼1位(除以2)。然後將這個右移的數字除以19(即38/2)。所以基本上我把這個數字除以38,就像在C++中完成的一樣。我得到了同樣的價值,我得到了C++

相關問題