2009-12-14 32 views
3

我在java中有一個很長的變量,並將其轉換爲二進制字符串,如用全部填充將數字轉換爲二進制字符串?

long var = 24; Long.toBinaryString(val);

現在這隻打印7位,但我需要顯示所有的64位,即所有的前導零,我怎麼能做到這一點?

原因是我需要遍歷每一位,並根據狀態執行操作,有沒有更好的方法來做到這一點?

回答

9

如果你想通過位迭代,你可能會更好測試的每一位沒有它轉換成字符串:

if ((val & (1L << bitPosition)) != 0) 
    // etc 

但是,如果你真正想要一個二進制字符串,這是左墊的最簡單方法它用零:

string padding = "0000000000000000000000000000000000000000000000000000000000000000"; 
string result = padding + Long.toBinaryString(val); 
result = result.substring(result.length() - 64, result.length()); // take the right-most 64 digits 
+1

沒有循環,耶! O(1)FTW。 – 2009-12-14 14:26:34

+6

確定有循環...只是由strcat/strcpys隱藏。如果你自己提供了領先的'0',那麼它的工作量大致相當。但是,這種方法很簡單。 – 2009-12-14 14:57:20

5

您可以使用二進制運算符來訪問一個長的各個位。以下代碼將「i」的各個位打印爲「true」或「false」。

long i = 1024; 
for(int n = 63; n >= 0; n--) 
    System.out.println(n + ": " + ((i & (1L << n)) != 0)); 
+0

很酷的破解向後循環:) – nes1983 2009-12-14 14:18:08

1

不知道,但我想應該是這樣的:

int i=0, thisbit; 
mask = 1; 
while (i++ < 64) 
{ 
    thisbit = var & mask; 
    // check thisbit here... 
    // 
    var = var >>> 1; 
    mask*=2; 
} 
+0

什麼是輸出? – nes1983 2009-12-14 14:26:39

+0

那麼,由於OP寫道,原因是迭代通過每個位,並根據狀態執行操作,所以沒有輸出,但在「//此處檢查此位」部分中的每個位上的操作。 – Gnudiff 2010-05-05 14:57:06

0

這將工作;

String s = Long.toBinaryString(val); 
while (s.length() < 64) 
{ 
    s = "0" + s; 
} 

如果你想用StringBuffer做到這一點,那麼;

StringBuffer s = new StringBuffer(Long.toBinaryString(val)); 
while (s.length() < 64) 
{ 
    s.insert(0, "0"); 
} 
String str = s.toString(); 
1

我會在@ Robert的答案上加上一些修改。而不是在這裏聲明填充變量,而是使用Long.numberOfLeadingZeros(long)。

其實內部它只使用移位操作符。

相關問題