我有一種感覺,這是一個相當微不足道的問題,但我很難過。在我的應用程序中,我用一對int鍵在查找表中鍵入事物。我認爲將兩個整數連接成一個長整型並將單長整型作爲一個鍵會更容易。從C背景的,我希望像這樣的工作:在Java中向上轉換或移位時抑制符號擴展
int a, b;
long l = (long)a << 32 | b;
我試圖在Java中複製這種已經我感到沮喪。特別是,因爲沒有無符號的整型,所以我似乎無法避免b的自動符號擴展(a是左移的,所以它是不相關的)。我嘗試過使用b & 0x00000000FFFFFFFF
,但它出乎意料地沒有效果。我也嘗試了相當醜陋的(long)b <<32>> 32
,但它似乎被編譯器優化了。
我曾希望嚴格使用位操作來處理原語,但我開始懷疑是否需要使用某種緩衝對象來實現這一點。
'(長)b << 32 >> 32'沒有優化出來。主要問題是>> sra和>>>是srl,這是你想要的:'(long)b << 32 > >> 32' – ide 2011-02-28 21:30:26
表達式'b&0x00000000FFFFFFFF'只是必須的,但爲什麼你要混淆它由那些零? – maaartinus 2011-02-28 21:39:20
@maaartinus:我對Java不熟悉,不知道它在內部存儲了那個十六進制文字。我知道在C十六進制文字是無符號的,但我擔心0xFFFFFFFF將被簽名擴展。事後看來,我只需要一個領先的零來滿足這個問題。儘管如此,表達沒有任何效果。 – 2011-02-28 21:42:54