Как рандомизировать первые 20 битов BitSet, пропуская младший значащий бит? - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь создать BitSet из 64 битов, где первые 20 бит генерируются случайным образом, пропуская LSB - LSB должен быть установлен на 1 или 0 в зависимости от того, является ли число 1 нечетным или четным ( вычисление битов четности).

Сейчас я могу создать 64 бита, где младший бит установлен в 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 - это бит четности.

1 Ответ

0 голосов
/ 06 февраля 2019

Я думаю, единственное, чего вам не хватает:

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

do:

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

... но вам придется объединить / объединить group с...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...