首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对跳过最低有效位的BitSet的前20位进行随机化?

如何对跳过最低有效位的BitSet的前20位进行随机化?
EN

Stack Overflow用户
提问于 2018-11-29 22:33:11
回答 1查看 105关注 0票数 1

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

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

代码语言:javascript
复制
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);

这将给出输出:

代码语言:javascript
复制
Bitset 0000000100000001000000010000000100000001000000010000000100000001

我希望它是这样的:

代码语言:javascript
复制
xxxxxxxp xxxxxxxp xxxxxx0p 0000000p 0000000p 0000000p 0000000p 0000000p

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

EN

回答 1

Stack Overflow用户

发布于 2019-02-06 19:18:58

我想你唯一缺少的就是:

代码语言:javascript
复制
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):

代码语言:javascript
复制
int randBits = rand.next(7);

...and具有以下特性:

代码语言:javascript
复制
public static final byte[] intToByteArray(int value) {
    return new byte[] {
        (byte)(value >>> 24),
        (byte)(value >>> 16),
        (byte)(value >>> 8),
        (byte)value};
}

执行以下操作:

代码语言:javascript
复制
BitSet group = BitSet.valueOf(intToByteArray(randBits));

...but你必须要mergre/concatenate the single groups...

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53541345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档