java - 如何创建和操作长度为1000万位的位数组

时间:2013-04-01 01:51:54

标签: java bitmap

我刚遇到一个问题;在伪代码中很容易解决,但是当我开始在java中编码时;我开始意识到我不知道从哪里开始...

以下是我需要做的事情:

  1. 我需要一个大小为1000万(位)的数组(我们称之为A)。
  2. 我需要能够将此数组中的元素设置为1或0(A [99000] = 1)。
  3. 我需要遍历1000万个元素。

4 个答案:

答案 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)

使用BitSet(正如Hunter McMillen已经在评论中指出的那样)。您可以轻松getset位。迭代只使用普通的for循环。

答案 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。另外,我们使用掩码和位移而不是除法和模运算来减少计算时间。改善是相当可观的。