我试图创建一个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位
答案 0 :(得分:0)
代码有几个问题:
填充BitSet
循环中的逻辑在第一次迭代中将索引0-6的位设置为第二次迭代在索引0-13的位设置。因此,第一组具有8位(在索引0-7处),但是第二组只有6位(索引8到13)。
亲自查看并在迭代过程中观察j
的值。
组基数
temp.cardinality() % 2 != 0
-BitSet.cardinality
返回此
中设置为true
BitSet
的位数
(JavaDoc)。因此,您需要在每次迭代中评估整个BitSet
的位数。但是您说过要检查“每组1的数量”。
设置LSB
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);
}
}