Java十进制到二进制int数组

时间:2012-03-22 20:14:15

标签: java

对于这个练习,我想要一个小数< 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;
    }

}

有什么建议吗?

7 个答案:

答案 0 :(得分:5)

一些伪代码:

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

因此,向右移动一位是除以2,与1进行AND运算总是只留下你想要的最低位。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

一个快速的建议是切换到字节数组而不是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;
}

答案 3 :(得分: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;
}

这使得单元测试变得更容易,并且您可以在各种情况下重复使用它。

答案 4 :(得分:0)

String s = Integer.toBinaryString(int value);

现在将String转换为int []

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

答案 5 :(得分: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';
    }

答案 6 :(得分: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;
    }