0

我需要生成一个二进制键序列,其中每个键的长度为“x”,并且每个键都是由对前一个键的特定操作生成的。
所以假设密钥长度为3,我应该能够生成一个序列(插图):

001 010 100 011 .....

每个密钥都必须通过对前一个密钥的一些位操作来派生,直到我们用尽了该特定密钥长度的所有可能排列。
由于我是位操作的新手 - 这是一个可能的操作吗?我们如何为任何给定的长度生成这个序列。
我更喜欢java中的一个例子——但这个想法是理解逻辑和具体的操作。

4

2 回答 2

0

以下是Java中的两种方法:

迭代:

0to开始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),只有两个值:01。For length > 1, prepend01来自先前递归的序列。例如,对于长度为 2 的情况,在前面的递归 output( ) 之前加上0和:。10, 100, 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;
}
于 2013-08-17T06:11:59.787 回答
0

如果进程必须是固定位操作,您可能想要寻找伪随机生成器。您可能也对格雷码感兴趣。

于 2013-08-17T03:53:26.973 回答