2012-03-22 81 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; 
}