我正在尝试创建一个 64 位的 BitSet,首先有 56 位,分为 7 个组。然后我检查每个组中是否有奇数个 1。如果是这样,那么我想添加一个 0 位,否则添加 1。这总共导致 64 位
for (int i = 1; i <= 8; i++) {
for (int j = 0; j < i * 7; j++) {
if (i < 3) {
if (i == 2 && j < 6) {
temp.set(j, r.nextBoolean());
} else if (i < 2) {
temp.set(j, r.nextBoolean());
}
}
}
if (temp.cardinality() % 2 != 0) {
temp.set(7, false);
} else {
temp.set(7, true);
}
}
现在,它只给我 7 或 8 位
最佳答案
代码有几个问题:
填充BitSet
循环中的逻辑在第一次迭代中设置索引 0 - 6 处的位,在第二次迭代中设置索引 0 - 13 处的位。因此,第一组有 8 位(在索引 0 - 7 处),但第二组只有 6 位(在索引 8 到 13 处)。
亲自查看并观察迭代过程中 j
的值。
组基数
temp.cardinality() % 2 != 0
- BitSet.cardinality
Returns the number of bits set to
true
in thisBitSet
(JavaDoc)。因此,您在每次迭代中评估整个 BitSet 的位数。但你说你想检查“每组中 1 的数量”。
设置最低有效位
temp.set(7, false);
和 temp.set(7, true);
- 设置索引 7
(LSB) 处的位仅适用于第一组。但这段代码是循环的一部分。您需要设置当前组的LSB。
我的建议
我建议将任务分为两个步骤:首先填充 BitSet,然后计算 BitSet 中每个组的 LSB。计算 LSB 的代码可能如下所示:
protected static void computeLsbOf8BitGroups(BitSet temp) {
for (int i = 0; i < temp.size() / 8; i++) {
int msb = i * 8;
BitSet group = temp.get(msb, msb + 8);
temp.set(msb + 7, group.cardinality() % 2 == 0);
}
}
关于java - 创建一个 BitSet,其中 LSB 位添加为 1 或 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53531119/