java - 如何随机化 BitSet 的前 20 位并跳过最低有效位?

标签 java bitset

我正在尝试创建一个 64 位的 BitSet,其中前 20 位是随机生成的,跳过 LSB - LSB 必须设置为 1 或 0,具体取决于 1 的数量是奇数或偶数( calculating 奇偶校验位)。

现在,我能够创建 64 位,其中 LSB 设置为 1,因为 1 (0) 的数量是偶数。我想要实现的是随机设置前 20 位(我猜是 MSB)。

BitSet temp = new BitSet();

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

        StringBuilder sb = new StringBuilder();
        for( int i = 0; i < temp.length();  i++ )
        {
            sb.append( temp.get( i ) == true ? 1: 0 );
        }

        System.out.println("Bitset " + sb);

这给出了输出:

Bitset 0000000100000001000000010000000100000001000000010000000100000001

我希望它是这样的:

xxxxxxxp xxxxxxxp xxxxxx0p 0000000p 0000000p 0000000p 0000000p 0000000p

其中,x 是随机设置的位(0 或 1),p 是奇偶校验位。

最佳答案

我认为您唯一缺少的是:

import java.util.Random; // see javadoc!

  Random rand = new Random(/*seed to re-produce sequence*/);
  ...
  for (int i = 0; i < temp.size() / 8; i++) {
        int msb = i * 8;
        // this can be done "maybe nicer", but in general -
        // set the next 7 bits (of temp up to 19th) randomly:
        for (int j = msb; j < msb + 7 && j < 20; j++) {
            temp.set(j, rand.nextBoolean());
        }

        //this should work as intended..
        BitSet group = temp.get(msb, msb + 8);
        temp.set(msb + 7, group.cardinality() % 2 == 0);
        ...
  }
<小时/>

您可以(可能)通过使用以下方式避免循环(1..7):

int randBits = rand.next(7);

...以及:

public static final byte[] intToByteArray(int value) {
    return new byte[] {
        (byte)(value >>> 24),
        (byte)(value >>> 16),
        (byte)(value >>> 8),
        (byte)value};
}

做:

BitSet group = BitSet.valueOf(intToByteArray(randBits));

...但你必须mergre/concatenate the single groups...

关于java - 如何随机化 BitSet 的前 20 位并跳过最低有效位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53541345/

相关文章:

java - 鼠标点击事件改变颜色

java - 使用 BouncyCaSTLe 在 Java 6 上运行 TLS 1.2

java - 在@ModelAttribute方法中访问时@RequestParam为null

c++ - 如何在位集中存储更大的二进制数 (C++)

mysql - 将标签保存为 MySQL 中的位字段。带索引?

c++ - 分配bitset c++的不同区域

c++ - 位集拆分为字符

java - Google App Engine 慢日志更新

java - 向矩阵/二维数组添加新列

x86 - 使用 SSE 的位集的实现和性能