2016-03-31 3 views
0

В Java, имея номер, например 0b1010, я хотел бы получить список номеров «составление» этого: 0b1000 и 0b0010 в этом примере: один номер для каждого битового набора.Получение списка двоичных чисел, составляющих число

Я не уверен в лучшем решении для его получения. У вас есть какая-то подсказка?

+0

использовать побитовые операторы, чтобы проверить, установлено ли оно в значении e вы хотите – AngryDuck

ответ

1

Используйте BitSet!

long x = 0b101011; 
BitSet bs = BitSet.valueOf(new long[]{x}); 
for (int i = bs.nextSetBit(0); i >=0 ; i = bs.nextSetBit(i+1)) { 
    System.out.println(1 << i); 
} 

Выход:

1 
2 
8 
32 

Если вы действительно хотите, чтобы они распечатываются в виде двоичных строк, вот немного хак по вышеуказанному методу:

long x = 0b101011; 
char[] cs = new char[bs.length()]; 
Arrays.fill(cs, '0'); 

BitSet bs = BitSet.valueOf(new long[]{x}); 
for (int i = bs.nextSetBit(0); i >=0 ; i = bs.nextSetBit(i+1)) { 
    cs[bs.length()-i-1] = '1'; 
    System.out.println(new String(cs)); // or whatever you want to do with this String 
    cs[bs.length()-i-1] = '0'; 
} 

Выход:

000001 
000010 
001000 
100000 
+0

Вы можете использовать Integer.toBinaryString() :) –

+0

D'oh! Знаешь, я знал, что для этого должен быть какой-то метод, - просмотрел все «java.text» и «java.util.Formatter» и сдался. Упс! – dcsohl

1

Сканирование через бит один за другим с использованием операции И. Это скажет вам, установлен ли бит в одной позиции или нет. (https://en.wikipedia.org/wiki/Bitwise_operation#AND). После того, как вы определили, что определен бит i-бит, составьте строку и распечатайте ее. ПСЕВДОКОД:

public static void PrintAllSubbitstrings(int number) 
{ 
    for(int i=0; i < 32; i++) //32 bits maximum for an int 
    { 
     if(number & (1 << i) != 0) //the i'th bit is set. 
     { 
      //Make up a bitstring with (i-1) zeroes to the right, then one 1 on the left 
      String bitString = "1"; 
      for(int j=0; j < (i-1); j++) bitString += "0"; 
      System.out.println(bitString); 
     } 
    } 
} 
0

Вот небольшой тест, который работает для меня

public static void main(String[] args) { 
    int num = 0b1010; 
    int testNum = 0b1; 
    while(testNum < num) { 
     if((testNum & num) >0) { 
      System.out.println(testNum + " Passes"); 
     } 
     testNum *= 2; 
    } 
} 
Смежные вопросы