我刚遇到一个问题;在伪代码中很容易解决,但是当我开始在java中编码时;我开始意识到我不知道从哪里开始...
以下是我需要做的事情:
答案 0 :(得分:24)
Java中的“正确”方法是使用Hunter McMillen指出的已经存在的BitSet类。如果你正在想出如何纯粹为了思考一个有趣的问题来管理一个大的位数组,那么计算一个字节数组中位的位置就是基本的模运算。
public class BitArray {
private static final int ALL_ONES = 0xFFFFFFFF;
private static final int WORD_SIZE = 32;
private int bits[] = null;
public BitArray(int size) {
bits = new int[size / WORD_SIZE + (size % WORD_SIZE == 0 ? 0 : 1)];
}
public boolean getBit(int pos) {
return (bits[pos / WORD_SIZE] & (1 << (pos % WORD_SIZE))) != 0;
}
public void setBit(int pos, boolean b) {
int word = bits[pos / WORD_SIZE];
int posBit = 1 << (pos % WORD_SIZE);
if (b) {
word |= posBit;
} else {
word &= (ALL_ONES - posBit);
}
bits[pos / WORD_SIZE] = word;
}
}
答案 1 :(得分:17)
答案 2 :(得分:0)
byte[] A = new byte[10000000];
A[99000] = 1;
for(int i = 0; i < A.length; i++) {
//do something
}
如果你真的想要比特,可以使用布尔值,让true = 1,假设= 0。
boolean[] A = new boolean[10000000];
//etc
答案 3 :(得分:0)
以下是 phatfingers &#39; BitArray&#39;
的更优化实现class BitArray {
private static final int MASK = 63;
private final long len;
private long bits[] = null;
public BitArray(long size) {
if ((((size-1)>>6) + 1) > 2147483647) {
throw new IllegalArgumentException(
"Field size to large, max size = 137438953408");
}else if (size < 1) {
throw new IllegalArgumentException(
"Field size to small, min size = 1");
}
len = size;
bits = new long[(int) (((size-1)>>6) + 1)];
}
public boolean getBit(long pos) {
return (bits[(int)(pos>>6)] & (1L << (pos&MASK))) != 0;
}
public void setBit(long pos, boolean b) {
if (getBit(pos) != b) { bits[(int)(pos>>6)] ^= (1L << (pos&MASK)); }
}
public long getLength() {
return len;
}
}
由于我们使用64的字段,我们将最大大小扩展到137438953408位,这大致适合16GB的ram。另外,我们使用掩码和位移而不是除法和模运算来减少计算时间。改善是相当可观的。