如何在1024X 10矩阵中生成0&1和1的组合

时间:2016-04-18 22:27:25

标签: java arrays matrix combinations

我必须在矩阵中生成0' s和1的所有可能组合..喜欢:

0000000000, 0000000001, 0000000010, 0000000011.... etc.

有没有比使用嵌套for循环更好的方法呢?

class Reliability {
// Trying to create combinations of 0 and 1s
public static void main(String[] args) {
// Creating an array of size 1024X10
    int connectMat[][] = new int[1024][10];

    int count1 = 0;
// Intitially all rows are set to zero
    for (int r1 = 0; r1 <= 1; r1++) {
// fill all rows with 0 and the 1
        for (int r2 = 0; r2 <= 1; r2++) {
            for (int r3 = 0; r3 <= 1; r3++) {
                for (int r4 = 0; r4 <= 1; r4++) {
                                        // Updating the elements of each row 
                                            connectMat[count1][0] = r1;
                                            connectMat[count1][1] = r2;
                                            connectMat[count1][2] = r3;
                                            connectMat[count1][3] = r4;

                             // Incrementing count to point to the next row
                                            count1++;
                                        }
                                    }
                                }
                            }

1 个答案:

答案 0 :(得分:1)

此问题直接转换为查看每个行号的二进制表示。我们可以使用位操作来提取必要的值。

final int BITS = 10;

int[][] connectMat = new int[1 << BITS][BITS];

for (int i = 0; i < (1 << BITS); ++i) {
    for (int j = 0; j < BITS; ++j) {
        connectMat[i][j] = (i >> (BITS-1 - j)) & 1;
    }
}

请注意,1 << 10等于2 10 或1024.这解释了1 << BITS

要理解(i >> (BITS-1 - j)) & 1,让我们看一些示例值。我们说二进制中的i == 6731010100001。让我们说j == 2意味着我们想要左边的第三位。替换所有变量,我们有:

connectMat[673][2] = (673 >> (10-1 - 2)) & 1;

班次为673 >> 10-1 - 2673 >> 7。将1010100001移至右侧7个位置会切断最右边的七个位,为我们提供1010100001。看看我们想要的位现在是最右边的位?最后的& 1提取最右边的位,因此我们得到1作为最终结果。作业最终为:

connectMat[673][2] = 1;