java - 创建一个 BitSet,其中 LSB 位添加为 1 或 0

标签 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 位

最佳答案

代码有几个问题:

填充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 this BitSet

(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/

相关文章:

java - 如何仅将disruptor库用作对象池?

java - 从soap web服务返回列表或数组(cxf)

python - 访问变量的信息

c++ - 检查二进制数是否能被 13 整除

java - 正确使用 BitSet 来替换基于 int 的标志。是否可以?

c++ - 使用位集适配器从operator []返回引用

java - 静态类或实例作为参数?

java - 哈希函数在java中生成只有5位数字的哈希值

java - 如何在 NetBeans SWING 内的循环中使用 Thread.sleep?

php - 如何创建一个循环来传递MySQL表中的空数据