我需要生成一个二进制密钥序列,其中每个密钥的长度为“x”,每个密钥由前一个密钥上的特定操作生成。
因此,假设密钥长度为3,我应该能够生成一个序列(插图):
001 010 100 011 .....
每个密钥必须通过前一个密钥的某些位操作得出,直到我们用尽特定密钥长度的所有可能的排列。
因为我是比特操作的新手 - 这是一个可能的操作;我们如何为任何给定的长度生成这个序列
我更喜欢java中的一个例子 - 但我的想法是理解逻辑和特定的oepration。
答案 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),只有两个值: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;
}