创建一个将LSB位添加为1或0的BitSet

时间:2018-11-29 02:48:02

标签: java for-loop bitset

我试图创建一个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位

1 个答案:

答案 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);
    }
}