2012-03-22 85 views
0

對於這個練習我讓我想要一個十進制< 4096在二進制形式寫入一個int數組。Java十進制到二進制int數組

因此,例如,4將是{0,0,0,0,0,0,0,0,0,1,0,0}。我需要這個(幾乎)所有的整數多達4096個,所以我寫了這段代碼:

for(int k=0; k<4096; k++){ 
    int[] myNumber = { (k/2048) % 2, (k/1024) % 2, (k/512) % 2, (k/256) % 2, (k/128) % 2, (k/64) % 2, (k/32) % 2, (k/16) % 2, (k/8) % 2, (k/4) % 2, (k/2) % 2, (k/1) % 2 } 
    /* Some processing */ 
} 

這看起來有點醜,所以這就是爲什麼我很好奇,看看是否有實現這個更優雅的方式?

對於有興趣的讀者:
我選擇用於存儲所述的二進制數的陣列的方法,因爲我需要執行一些移位和加法模2我使用的LFSR,並且這是我的執行情況如下:

public class LFSR { 

    private int[] polynomial; 

    public LFSR(int[] polynomial) { 
     this.polynomial = polynomial; 
    } 

    public int[] shiftLeft(int[] input) { 
     int[] result = new int[input.length]; 

     int out = input[0]; 
     result[input.length - 1] = out; 
     for (int i = input.length - 1; i > 0; i--) { 
      result[i - 1] = (input[i] + polynomial[i - 1] * out) % 2; 
     } 

     return result; 
    } 

} 

有什麼建議嗎?

+2

位運算符:http://vipan.com/htdocs/bitwisehelp.html http://www.leepoint.net/notes-java/data/expressions/bitops.html。也許你甚至不需要int數組。 – madth3 2012-03-22 20:21:52

回答

5

一些僞代碼:

While (int i = 0; i < 12; i++) { 
    bitarray[i] = numericalValue & 0x1; 
    numericalValue = numericalValue >> 1; 
} 

所以,向右一位的移位是除以2,取與1總是讓你只用最低位,它是你想要的。

+0

這是不正確的,因爲在這個例子中,最高位最先出現在你的代碼最後的地方。 – nicktalbot 2012-03-22 20:39:09

+0

啊,老師確實暗示了這一點,但我不知道它有多容易。謝謝! – nhaarman 2012-03-22 20:39:28

+0

@nickt但這只是一個簡單的補充。這是整個練習更優雅的方式。 – nhaarman 2012-03-22 20:40:43

0

一個簡單的建議是切換到一個字節數組,而不是一個int數組,只是爲了節省空間,因爲它們只是'位'。

至於提高解決方案的優雅,它可能是更容易使用subcomputations:

int[] intToBinaryArray(int dec){ 

int[] res = int[12] 
for(int i =0; i < 12; i++) 
    bitarray[i] = numericalValue & 0x1; //grab first bit only 
    dec /= 2; 
} 

return res; 
} 
0

「雅」是在旁觀者的眼睛,但我想通過創造一種方法啓動避免重複,提高清晰度:

int[] myNumber = { getBit(k, 12), getBit(k, 11), ... }; 

我個人覺得這是「最優雅」的方式來獲得特定位:

int getBit(int v, int i) 
{ 
    return v >> i & 1; 
} 

然後,您必須決定是否要繼續重複調用getBit,或者您是寧願只使用單個whilefor循環來填充整個陣列。你會認爲它的寫法會更快,但如果你使用Jochen所建議的循環,那麼JIT編譯器很有可能會自動爲你展開循環。

由於這種特定的操作完全是自包含的,你可能甚至想爲它創建一個特殊的方法:

int[] getBits(int v, int num) 
{ 
    int[] arr = new int[num]; 
    for(int i=0; i<num; i++) { 
     arr[i] = getBit(v, num - i - 1); 
    } 
    return arr; 
} 

這使得它更容易單元測試,你可以在各種情況下重用。

0
String s = Integer.toBinaryString(int value); 

現在的字符串轉換爲int []

int[] intArray = new int[s.length()]; 
for (int i = 0; i < s.length(); i++) { 
intArray[i] = Character.digit(s.charAt(i), 10); 
} 
0

這有點短;)

int[] bits = new int[13]; 
    String bin = Integer.toBinaryString(8192 + value); 
    for(int i = 1; i < bin.length(); i++) { 
     bits[i-1] = bin.charAt(i)-'0'; 
    } 
0

你可以同時使用移位操作withbthe位AND運算符如下。注意bitCount - i - 1是需要先獲得高位的。

final int bitCount =12; // Increase to support greater than 4095 
    int[] number = new int[bitCount]; 
    for(int i = 0; i < bitCount; i++) 
    { 
     number[i] = (k >>> (bitCount - i - 1)) & 1; 
    } 
+0

謝謝! :-)格式似乎不適用於我的平板電腦。 – nicktalbot 2012-03-22 20:52:03

+0

所有你需要的是你的段落和代碼之間的空行。 – StriplingWarrior 2012-03-22 20:53:31

+0

@StriplingWarrior謝謝,我會在下次嘗試。 – nicktalbot 2012-03-22 20:55:28

1
public int[] toBin (int num) 
{ 
int[] ret = new int[8]; 
for (int i = 7, p = 0; i>=0; i--, p++) 
{ 
ret[i] = (num/2**p) % 2; 
} 
return ret; 
}