我正在尝试编写一种算法来打印给定数字集的幂集。我用一个从零到我的集合的 2^length 的循环来做到这一点。我将索引 i 转换为二进制,只要有一个,我就打印那个数字。但是,由于该字符串前面没有任何零,因此我没有得到正确的输出。
例如,如果我有一组三个数字:{2, 3, 4},当我是 3 时,我希望字符串是“011”,但它是“11”,我得到输出 2, 3 而不是 3, 4。
这是我的代码:
public static void powerset (int[] A){
double powerSetLength = Math.pow(2, A.length);
for (int i=0; i<powerSetLength; i++){
String bin = Integer.toBinaryString(i);
System.out.println ("\nbin: " + bin);
for (int j=0; j<bin.length(); j++){
if (bin.charAt(j)=='1')
System.out.print(A[j] + " ");
}
}
System.out.println();
}
这是我得到的输出:
9 7 2
bin: 0
bin: 1
9
bin: 10
9
bin: 11
9 7
bin: 100
9
bin: 101
9 2
bin: 110
9 7
bin: 111
9 7 2
这是我想要获得的输出示例:
9 7 2
bin 001
2
我想知道是否有一种方法可以将整数转换为具有指定位数的二进制,以便我可以获得此输出。
最佳答案
处理此问题的一种简单方法是假设如果表示中缺少数字,则其值为零。你可以这样做:
// The number of digits you want is A.length
for (int j=0; j < A.length ; j++) {
// If j is above length, it's the same as if bin[j] were zero
if (j < b.length() && bin.charAt(j)=='1')
System.out.print(A[j] + " ");
}
}
当然,如果您可以假设A.length < 64
(如果您希望您的程序在一年内完成打印,您应该能够假设)您可以使用 long
代表您的号码,以及位操作以检查是否设置了位:
int len = A.length;
for (long mask = 0 ; mask != (1L << len) ; mask++) {
for (int i = 0 ; i != len ; i++) {
if ((mask & (1L << i)) != 0) {
System.out.print(A[j] + " ");
}
}
System.out.print();
}
关于java - 指定二进制数的字符串表示形式中的位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18818694/