【发布时间】:2013-09-05 01:13:38
【问题描述】:
以下是破解编码面试书10-4题解法中BitSet的实现。为什么它分配一个 size/32 而不是 (size/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;
}
}
【问题讨论】:
-
另外,我们可以分配一个 ceil(size / 32.0) 元素数组,以避免在 size 可被 32 整除时分配额外的元素。
-
我只能假设这被忽略了,因为它只应该涵盖 32,000 个元素的情况,即 32 的倍数。对于任何不是 32 的倍数的数字 N,此代码将- 正如你所说 - 失败。您应该给作者留个便条,让他们知道,以便他们解决这个问题。
-
我查了那本书的Errata,没有列出错误。考虑到他们最近在 5 天前有更正,我肯定会给他们写一封电子邮件;最坏的情况,你我都错了,他们会告诉你原因。
-
@GBach 对于任何小于 32,001 的 N,代码都不会失败。书中解决方案中bitset的构造不依赖于N。答案中bitset的大小设置为32,000正好涵盖了问题中的场景,其中N
-
@groovy 如果它旨在处理一种特定情况,那么更简洁的设计将是不编写一个构造函数,该构造函数接受一个参数并且对于不是 32 的倍数的
size值失败而是将大小 32000 硬编码到构造函数中。 BitSet 的构造函数的编写方式表明它适用于任何size,但它不是。