下面是在破解编码访谈录的问题10-4的解决方案中位集的实现为什么它要分配一个大小为/32而不是(大小/32+1)的数组。我是不是丢了什么东西,还是这是个虫子?
如果我将33传递给位集的构造函数,那么我将只分配一个int,如果我尝试设置或获取位32,我将获得一个av!

package Question10_4;

class BitSet {
    int[] bitset;

    public BitSet(int size) {
            bitset = new int[size >> 5]; // divide by 32
    }

    boolean get(int pos) {
            int wordNumber = (pos >> 5); // divide by 32
            int bitNumber = (pos & 0x1F); // mod 32
            return (bitset[wordNumber] & (1 << bitNumber)) != 0;
    }

    void set(int pos) {
            int wordNumber = (pos >> 5); // divide by 32
            int bitNumber = (pos & 0x1F); // mod 32
            bitset[wordNumber] |= 1 << bitNumber;
    }

}

最佳答案

从阅读你提到的解决方案(第205页)和我对计算机编程的一点了解中,我发现这是位集的一个特殊实现,在它的构造中采用32000的参数(参见checkDuplicates函数)问题是检查一个从1到n的数组,其中n最多为32000个,只有4KB的内存)。
这样,就创建了一个1000个元素的数组,每个元素用于位集中的32位在bitset类中可以看到,为了得到一个位的位置,我们(floor)除以32得到数组索引,然后mod 32得到特定的位位置。

08-19 20:20