以下是在问题10-4的解决方案中破解编码采访书中BitSet的实现。为什么分配大小/ 32的数组(大小/ 32 + 1)。我在这里遗漏了什么或这是一个错误吗?
如果我将33传递给BitSet的构造函数,那么我将只分配一个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;
}
}
答案 0 :(得分:0)
从我从阅读你提到的解决方案(第205页)以及我对计算机编程的一点了解中可以得到的东西,在我看来,这是一个特殊的bitset实现,意味着采用32,000的参数在它的构造中(参见checkDuplicates
函数。问题是关于检查数字从1到N的数组,其中N最多为32,000,只有4KB的内存)。
这样,创建了一个包含1000个元素的数组,每个元素用于位集中的32位。你可以在bitset类中看到得到一个位的位置,我们(floor)除以32得到数组索引,然后用mod 32得到特定的位位置。
答案 1 :(得分:0)
是的,书中的答案是不正确的。 正确答案:
bitset = new int[(size + 31) >> 5]; // divide by 32