如何获得 JAVA 中 0 和 1 位的所有可能排列

How to get all possible permutations for 0 and 1 bits in JAVA

我需要长度为 3 的位的排列输出为(顺序无关紧要,因为 0 和 1 的初始组合是随机生成的):

[0,0,0]

[0,0,1]

[0,1,0]

[0,1,1]

[1,0,0]

[1,0,1]

[1,1,0]

[1,1,1]

我已经完成了,但似乎有重复项并且一些可能的排列没有显示,我不确定为什么。这是我的代码:

'

  ArrayList<Item> itemsAvailable = new ArrayList<Item>();
  ArrayList<Integer>bits = new ArrayList<Integer>();
  ArrayList<ArrayList<Integer>> tried = new ArrayList<ArrayList<Integer>>();

    itemsAvailable.add(new Item(5,4));
    itemsAvailable.add(new Item(12,10));
    itemsAvailable.add(new Item(8,5));

    System.out.println("itemsAvailable: " + itemsAvailable);

    Random r = new Random();

    //permutations
    for(int i = 0; i < Math.pow(2,itemsAvailable.size()); i++){
        //Generate random bits

        for(int j = 0; j < itemsAvailable.size(); j++){
            int x = 0;

            if (r.nextBoolean())
                x = 1;

            bits.add(x);

        }


        System.out.println("Added to bits #" + (i+1) + ": " + bits);

        bits = new ArrayList<Integer>();
    }

'

我得到的输出是:

添加到第 1 位:[0, 0, 1]

添加到第 2 位:[1, 1, 0] - 重复

添加到第 3 位:[1, 0, 1]

添加到第 4 位:[0, 0, 1]

添加到第 5 位:[0, 0, 0] - 重复

添加到第 6 位:[1, 1, 0] - 重复

添加到第 7 位:[1, 1, 1]

添加到第 8 位:[0, 0, 0] - 重复

因此,由于位是随机生成的,因此如何获得 8 个不同的排列?请帮忙。

谢谢。

有一种更简单的方法可以解决这个问题。想想这些位在二进制中代表什么,在无符号二进制补码中:

  • [0,0,0] -> 0
  • [0,0,1] -> 1
  • [0,1,0] -> 2
  • ...
  • [1,1,1] -> 7

所以获得所有这些排列的简单方法是:

for (int i = 0; i < 8; ++i) {
    bits.add(i);
}

8 是从哪里来的?它只是 2^3,因为你想要长度 3。

此技术最多适用于 31 位,因为 Java 的 int 类型是有符号的(而上面基本上将其视为无符号,适用于那些较低的数字)。

您可以通过使用 long 而不是 int 将其增加到 2^63,并且您可以通过枚举 all 长整数来获得 64 位长度。除此之外,您还需要一种不同的方法;但是 2^64 长,每个长 8 个字节,大约是 1.5e11 千兆字节——所以在你需要一个更复杂的算法之前,你会 运行 内存不足。

如果您知道组合只是计数,那么您可以这样做:

public static void main(String[] args) {
    for (int i = 0; i < 8; i++) {
        System.out.println(String.format("%3s", Integer.toBinaryString(i)).replace(' ', '0'));
    }
}

在哪里 Integer.toBinaryString(i) 会将 i 值打印为二进制

String.format("%3s", Integer.toBinaryString(i)).replace(' ', '0')

将在左侧添加前导零,以便您更好地阅读