我正在尝试编写一个算法,用于打印给定数字集的powerset。我做了一个循环,从我的集合的零到2 ^长度。我将索引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
我想知道是否有办法将整数转换为具有指定位数的二进制,以便我可以获得此输出。
答案 0 :(得分:1)
处理此问题的一种简单方法是假设如果表示中缺少数字,则其值为零。你可以这样做:
// 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();
}
答案 1 :(得分:0)
String padded = String.format("%03d", somenumber);
或
System.out.printf("%03d", somenumber);
每个填充到三位数(格式说明符中的3)。您还可以根据所需的长度以编程方式构建说明符:
String.format("%0" + n + "d", somenumber)
但是如果您只需要知道是否设置了位N,那么这是不必要的。你可以轻松地做到这一点:
if ((value & (1L << n)) != 0) { }
其中value是数字,n是所需位数的序数。这在逻辑上与值有关 - 如果已设置,则结果为非零,if为真。如果未设置,则结果为零,if为false。