我需要生成一个二进制键序列,其中每个键的长度为“x”,并且每个键都是由对前一个键的特定操作生成的。
所以假设密钥长度为3,我应该能够生成一个序列(插图):
001 010 100 011 .....
每个密钥都必须通过对前一个密钥的一些位操作来派生,直到我们用尽了该特定密钥长度的所有可能排列。
由于我是位操作的新手 - 这是一个可能的操作吗?我们如何为任何给定的长度生成这个序列。
我更喜欢java中的一个例子——但这个想法是理解逻辑和具体的操作。
我需要生成一个二进制键序列,其中每个键的长度为“x”,并且每个键都是由对前一个键的特定操作生成的。
所以假设密钥长度为3,我应该能够生成一个序列(插图):
001 010 100 011 .....
每个密钥都必须通过对前一个密钥的一些位操作来派生,直到我们用尽了该特定密钥长度的所有可能排列。
由于我是位操作的新手 - 这是一个可能的操作吗?我们如何为任何给定的长度生成这个序列。
我更喜欢java中的一个例子——但这个想法是理解逻辑和具体的操作。
以下是Java中的两种方法:
从0
to开始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
。For length > 1
, prepend0
和1
来自先前递归的序列。例如,对于长度为 2 的情况,在前面的递归 output( ) 之前加上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;
}
如果进程必须是固定位操作,您可能想要寻找伪随机生成器。您可能也对格雷码感兴趣。