指定二进制数的字符串表示中的位数

时间:2013-09-15 23:54:47

标签: java binary

我正在尝试编写一个算法,用于打印给定数字集的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

我想知道是否有办法将整数转换为具有指定位数的二进制,以便我可以获得此输出。

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。