2017-01-19 58 views
1

我想拆分更多塊的bitset。分割功能取決於位集的基數,這是設置爲true的位數。 例如,我有此BitSet與基數4:Java拆分BitSet

INPUT: 101101 

所需的輸出是下面的:

OUTPUT: 100000 - 001000 - 000100 - 000001 

使用Java庫調用位集合是有功能或可能的方式來實現該?

回答

2

下面的代碼應用設置一個單比特每一個可能的面具,只保留非零結果:

int[] split(int input) { 
    return IntStream.iterate(Integer.reverse(1), mask -> mask >>> 1) 
      .limit(Integer.SIZE) 
      .map(mask -> input & mask) 
      .filter(result -> result != 0) 
      .toArray(); 
} 
+0

我會用Integer.SIZE –

+0

@ Jean-FrançoisSavard好,趕快,謝謝。 –

1

是的。使用基本操作AND。

Basicaly:對所有的子序列

xxxxxx AND 110000 = xx0000. 

重複上述步驟。

0

你需要一些循環這裏:

你應該找到的位置,那麼你可以做這樣一個循環:

然後如果位置在列表中存在,然後打印1個,否則打印0

public static void main(String[] args) { 
    String Input = "101101"; 

    //find positions 
    List<Integer> listPositivePosition = new ArrayList<>(); 
    for(int i = 0; i<Input.length(); i++){ 
     if(Input.charAt(i)=='1'){ 
      listPositivePosition.add(i); 
     } 
    } 

    for(int i = 0; i<listPositivePosition.size(); i++){ 
     for(int j = 0; j<Input.length(); j++){ 
      //If the position exist in the List then print 1 else print 0 
      if(j == listPositivePosition.get(i)){ 
       System.out.print("1"); 
      }else{ 
       System.out.print("0"); 
      } 
     } 
     System.out.println(); 
    } 

} 

希望這能幫助你。

+3

我不認爲任何涉及'String'操作的答案都是正確答案呃。也許除了'Integer.toBinaryString(...)' – martijnn2008

0

請原諒我的方法命名約定:)

public static void main(String[] args) { 

    final String a = "100100"; 
    System.out.println(Arrays.toString(foo(a))); 
} 

private static String[] foo(String a) { 
    final long counted = IntStream.range(0, a.length()).filter(i -> a.charAt(i) == '1').count(); 
    final String[] ret = new String[(int) counted]; 
    int index = 0; 
    for (int i = 0; i < a.length(); i++) { 
     if (a.charAt(i) == '1') { 
      ret[index] = ret(a, i); 
      index++; 
     } 
    } 
    return ret; 

} 

private static String ret(String a, int i) { 
    final StringBuilder sb = new StringBuilder(a.replaceAll(".", "0")); 
    sb.setCharAt(i, '1'); 
    a = sb.toString(); 
    return a; 
} 
0

純Java易於閱讀的解決方案:

List<String> binSplitter(String input) { 

    String str = new String(new char[input.length()]).replace("\0", "0"); 
    List<String> chunks = new ArrayList<>(); 

    for (int i = 0; i < input.length(); i++) { 
     if (input.charAt(i) == '1') { 
      chunks.add(str.substring(0, i) + "1" + str.substring(i + 1, input.length())); 
     } 
    } 

    return chunks; 
}