2015-07-03 5 views
2

Я хочу сгенерировать каждую возможную двоичную последовательность чисел, где каждая последовательность в списке ограничена определенным числом 1, и есть заполнение нулей, чтобы каждый список имел такую ​​же длину.Генерация двоичных последовательностей

Например, если последовательность должна быть длинной 4 числа, и имеют 2 единицы, все последовательности будут:

1100 1010 1001 0110 0101 0011

и нули в передней части числа сохраняются.

+1

Существует встроенная функция java, называемая Integer.toBinaryString (n); –

+0

Но как ограничить его только последовательностями только с определенным числом? @StigTore – Chromatica

+0

Вы можете создать 'String' нужного размера с количеством' 0' и '1', которое вы хотите в нем (например,' String a = "0011"; '), и использовать код из https : //stackoverflow.com/questions/4240080/generating-all-permutations-of-a-given-string для генерации всех перестановок/анаграмм. –

ответ

1

Попробуйте это:

//Edit your min and max, e.g. Integer.MAX_VALUE and Integer.MIN_VALUE 
int min = 0; 
int max = 10; 

for(int i = min; i < max; i++){ 
    //Make 16 bit long binary Strings 
    String s = String.format("%16s", Integer.toBinaryString(i)).replace(' ', '0'); 

    //Make 4 bits long chunks 
    List<String> chunks = new ArrayList<>(); 
    Matcher matcher = Pattern.compile(".{0,4}").matcher(s); 
    while (matcher.find()) { 
     chunks.add(s.substring(matcher.start(), matcher.end())); 
    } 

    StringBuilder b = new StringBuilder(); 
    for (String c : chunks) { 
     //Here you can count the 1 and 0 of the current chunk with c.charAt(index) 
     b.append(c); 
     b.append(" "); 
    } 
    System.out.println(b.toString()); 
} 
2

Если вы хотите сохранить 0s, а затем просто добавить утеплитель:

int end = 100; //Change this 
for (int i = 0; i <= end; i++) { 
    String bytestring = Integer.toBinaryString(i); 
    String padding = "00000000000000000000000000000000"; 
    bytestring = padding.substring(0, 32 - bytestring.length()) + bytestring; 
    System.out.println(bytestring); 
} 
3

Это может быть решена с помощью рекурсивных вызовов функции:

public class BinarySequences { 

    public static void main(String[] args) { 

     final int numCount = 4; 
     final int oneCount = 2; 

     checkSubString(numCount, oneCount, ""); 

     for (String res : results) { 
      System.out.println(res); 
     } 
    } 

    private static List<String> results = new ArrayList<>(); 

    private static void checkSubString(int numCount, int oneCount, String prefix) { 
     if ((numCount >= oneCount) && (oneCount >= 0)) { 
      if (numCount==1) { 
       if (oneCount==1) { 
        results.add(prefix + "1"); 
       } else { 
        results.add(prefix + "0"); 
       } 
      } else { 
       checkSubString(numCount-1, oneCount , prefix + "0"); 
       checkSubString(numCount-1, oneCount-1, prefix + "1"); 
      } 
     } 
    } 


} 
1

Требуется org.apache.commons.lang.StringUtils, но это делает его коротким:

final int digits = 4; 
final int onesrequired = 2; 

int maxindex = (int) Math.pow(2, digits); 

for (int i = 0; i < maxindex; i++) { 
    String binaryStr = Integer.toBinaryString(i); 

    if (StringUtils.countMatches(binaryStr, "1") == onesrequired) { 
     System.out.print(String.format("%" + digits + "s", binaryStr).replace(' ', '0') + " "); 
    } 
} 
Смежные вопросы