我正在尝试创建一个 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));
关于java - 如何随机化 BitSet 的前 20 位并跳过最低有效位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53541345/