簡體   English   中英

Java十進制到二進制int數組

[英]Java decimal to binary int array

對於本練習,我想將一個<4096的十進制數以二進制形式寫入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;
    }

}

有什么建議么?

一些偽代碼:

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

因此,右移一位就是2除,與1的AND運算始終只會使您得到所需的最低位。

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;
}

一個快速的建議是切換到字節數組而不是int數組,只是為了節省空間,因為它們只會是“位”。

關於改善解決方案的美觀性,使用子計算也許更容易:

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;
}

“優雅”在旁觀者眼中,但是我將首先創建一種避免重復並提高清晰度的方法:

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;
}

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

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);
}

這有點短;)

    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';
    }

您可以按如下方式將位移運算符與按位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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM