2017-01-19 9 views
1

Я хочу сплит бит в более куски. Функция расщепления зависит от мощности бита, которая представляет собой число бит, установленное в значение true. Например, у меня есть эта BitSet с мощностью 4:Java разбил битСеть

INPUT: 101101 

Нужный выход следующее:

OUTPUT: 100000 - 001000 - 000100 - 000001 

Использование библиотеки Java под названием BitSet есть функция или возможный способ для достижения этой цели ?

ответ

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', является правильным answ э. Может быть, кроме '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

Pure 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; 
}