生成二进制序列

时间:2013-08-17 03:45:11

标签: binary bit-manipulation bitwise-operators binary-operators

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

001 010 100 011 .....

每个密钥必须通过前一个密钥的某些位操作得出,直到我们用尽特定密钥长度的所有可能的排列。
因为我是比特操作的新手 - 这是一个可能的操作;我们如何为任何给定的长度生成这个序列 我更喜欢java中的一个例子 - 但我的想法是理解逻辑和特定的oepration。

2 个答案:

答案 0 :(得分:0)

如果进度必须是固定位操作,您可能希望查找伪随机生成器。您可能也对灰色代码感兴趣。

答案 1 :(得分:0)

以下是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),只有两个值:01。对于length > 1,将01添加到前一次递归的序列中。例如,对于长度为2,将01添加到上一个递归输出(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;
}