我必须在矩阵中生成0和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++;
}
}
}
}
最佳答案
此问题直接转化为查看每个行号的二进制表示形式。我们可以使用位运算来提取必要的值。
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
等于210或1024。这解释了1 << BITS
。为了理解
(i >> (BITS-1 - j)) & 1
,让我们看一些示例值。假设i == 673
或二进制中的1010100001
。并说j == 2
意味着我们要从左数第三位。替换所有变量,我们有:connectMat[673][2] = (673 >> (10-1 - 2)) & 1;
移位为
673 >> 10-1 - 2
或673 >> 7
。将1010100001
移到右边的7个位置会切断最右边的7个位,从而使我们成为101
。看看我们想要的位现在是最右边的位了吗?最后的& 1
提取最右边的位,因此我们得到1
作为最终结果。分配结果为:connectMat[673][2] = 1;