2012-11-29 70 views
3

首先:林知道的事實,Java的完全不認識任何(未)signess的Java:轉換符號整數爲unsigned long

我的問題涉及以下情況:

想象一下,你有一個int i = -1 // (== 0b1111111_11111111_11111111_11111111)。 現在我想要「轉換」這個長整型代表字節值,例如在這個具體的例子中:long l = 0xFFFFFFFF // (== 0b1111111_11111111_11111111_11111111)

我的問題是如何在上面的例子中可以從i獲得l

回答

3

你可以使用按位數學,下面的代碼應該是自我解釋的。如果你不明白,請在評論中提問。

public class LongConversion { 
    public static void main(String args[]) { 
    for (int i = -1; i > -40; i -= 9) { 
     // THIS IS THE IMPORTANT LINE, THE REST IS JUST FOR DEMONSTRATION 
     long l = 0x00000000FFFFFFFFl & (long) i; 

     System.out.println("Original i: " + i); 
     System.out.println(Integer.toHexString(i)); 
     System.out.println("Longed i: " + l); 
     System.out.println(zeroLong(l)); 
     System.out.println(); 
    } 
    } 

    public static String zeroLong(long l) { 
    return String.format("%16s", Long.toHexString(l)).replace(' ', '0'); 
    } 
} 

該代碼輸出:

Original i: -1 
ffffffff 
Longed i: 4294967295 
00000000ffffffff 

Original i: -10 
fffffff6 
Longed i: 4294967286 
00000000fffffff6 

Original i: -19 
ffffffed 
Longed i: 4294967277 
00000000ffffffed 

Original i: -28 
ffffffe4 
Longed i: 4294967268 
00000000ffffffe4 

Original i: -37 
ffffffdb 
Longed i: 4294967259 
00000000ffffffdb 
+2

您可以使用略短的'&0xFFFFFFFFL'。 –

+2

的確如此,但我只是爲了簡潔起見 – durron597

-1

您可以使用API​​做的工作:

long l = Long.parseLong(Integer.toBinaryString(i), 2); 

toBinaryString()方法的javadoc說

返回一個整數參數的字符串表示爲無符號整數基地2


雖然這種技術是否定的與使用位掩碼一樣快,它不是「慢」。

我在我的(典型)個人電腦上做了一些適當的時間,這個轉換隻需要270納秒,這在我的書中仍然非常快。

此外,它使用API​​來完成工作,而不是功夫,這是更容易閱讀和有點自我記錄。

+0

在這種情況下,字符串解析永遠不是正確的答案。非常慢。 – durron597

+0

@ durron597儘管它不如掩碼那麼快,但速度並不慢。我在我的(典型)個人電腦上做了一些時間安排,轉換時間僅爲270納秒,這在我的書中非常快。此外,它使用API​​來完成這項工作,我認爲這是一個有效的替代功夫功夫 – Bohemian

+0

功夫功夫需要多長時間? – durron597

相關問題