Генерирование двоичной последовательности

Мне нужно сгенерировать двоичную последовательность ключей, где каждый ключ имеет длину 'x', и каждый ключ генерируется определенной операцией над предыдущим ключом.
Предполагая, что длина ключа равна 3, я должен быть в состоянии сгенерировать последовательность как (иллюстрация):

001 010 100 011 .....

Каждый ключ должен быть получен некоторой битовой операцией над предыдущим ключом, пока мы не исчерпали все возможные перестановки для этой конкретной длины ключа.
Поскольку я новичок в битовых операциях - это возможная операция, и как мы генерируем эту последовательность для любой заданной длины.
Я бы предпочел пример на языке Java, но идея состоит в том, чтобы понять логику и конкретную работу.

2 ответа

Решение

Возможно, вы захотите поискать псевдослучайные генераторы, если прогрессия должна быть фиксированной битовой операцией. Возможно, вас заинтересуют серые коды.

Вот два подхода в Java:

Повторяющийся:

Начать с 0 в 2^length и преобразовать каждое число в двоичную строку, дополненную нулями впереди.

public static List<String> binarySequence(final int length) {
    final int noOfItems = 1 << length;
    final List<String> sequences = new ArrayList<>(noOfItems);
    final String format = "%" + length + "s";
    for (int num = 0; num < noOfItems; num++) {
        final String binary = String.format(format,
                Integer.toBinaryString(num)).replace(' ', '0');
        sequences.add(binary);
    }
    return sequences;
}

Рекурсивный:

Базовый случай (длина 1), только два значения: 0 а также 1, За length > 1, готовый 0 а также 1 в последовательности из предыдущей рекурсии. Например, для длины 2, предшествующий 0 а также 1 к предыдущему выводу рекурсии (0, 1): 00, 01, 10, 11,

public static List<String> binarySequenceRecur(final int length) {
    final List<String> sequences;
    if (length <= 1) {
        sequences = Arrays.asList("0", "1");
    } else {
        final List<String> prevSequences = binarySequence(length - 1);
        final LinkedList<String> seqs = new LinkedList<>();
        for (final String seq: prevSequences) {
            seqs.addLast("0" + seq);
        }
        for (final String seq: prevSequences) {
            seqs.addLast("1" + seq);
        }
        sequences = seqs;
    }
    return sequences;
}
Другие вопросы по тегам