отпечатване на двоични числа във възходящ ред

Опитвах се да отпечатам двоични числа във възходящ ред на 0 (00 след това 01, 10, 11).

Такива, че нулите са преди.

Опитах да използвам кода по-долу от тук, но това не дава правилната операция (текуща проба)

void test2() {

    final int grayCodeLength = 4;

    // generate matrix
    final int grayCodeCount = 1 << grayCodeLength; // = 2 ^ grayCodeLength
    int grayCodeMatrix[][] = new int[grayCodeCount][grayCodeLength];
    for (int i = 0; i < grayCodeCount; i++) {
        int grayCode = (i >> 1) ^ i;
        for (int j =0;  j <grayCodeLength; j++) {
            // extract bit
            final int grayCodeBitMask = 1 << j;
            grayCodeMatrix[i][j] =  (grayCode & grayCodeBitMask) >> j;
        }
    }

    // view result
    for (int y = 0; y < grayCodeMatrix.length; y++) {
        for (int x = 0; x < grayCodeMatrix[0].length; x++) {
            System.out.print(grayCodeMatrix[y][x]);
        }
        System.out.print("\n");
    }
}

но тази операция не е за възходящ ред от 0.

Така че трябваше да направя с низове в този код (текуща проба)

class Main
  {
    static int k = 4;
    public static void main (String[] args) throws java.lang.Exception
    {

            new Main().test7(k, "");
    }

    void test7(int i, String a) {

    a = a + "0";

    if (a.length() == k) {
        System.out.println(""+a);
        a = a.substring(0, a.length()-1);
        a =a +"1";
        System.out.println(a);
    }else {
        test7(i-1, a);
        if (a.length() >1) {
            a =a.substring(0, a.length()-1);
            a =a+"1";
        } else {
            a = "1";
        }
        test7(i-1,a);
    }

}

}

всеки изход за оптимизиране за този o/p с помощта на сив код.


person Pradyut Bhattacharya    schedule 28.07.2013    source източник
comment
Какво точно очаквате да оптимизирате?   -  person    schedule 29.07.2013
comment
първото използване на сивия код, така че o/p е (00,01,10,11)... надявам се това да е ясно   -  person Pradyut Bhattacharya    schedule 29.07.2013
comment
Не отпечатвате ли просто двоичното представяне от 0 to 2^k-1?   -  person P0W    schedule 29.07.2013
comment
Редът (00,01,10,11) не е код на Грей. За кода на Грей последователните елементи трябва да се променят само с един бит; вашият втори и трети елемент (01 и 10) се различават по два бита. Правилният код на Грей би бил (00,01,11,10) или (00,10,11,01). И така, искате ли ред на кода на Грей или цифров ред? (Или нещо друго?)   -  person Ted Hopp    schedule 29.07.2013
comment
@P0W да... (подплънка за stackoverflow)   -  person Pradyut Bhattacharya    schedule 29.07.2013
comment
@TedHopp, моля, хвърлете малко светлина върху числовия ред...   -  person Pradyut Bhattacharya    schedule 29.07.2013
comment
Числовият ред ще бъде както сте посочили: (00,01,10,11). Това е, както @P0W описа: двоичното представяне на числа във възходящ числов ред. Но кодът на Грей няма нищо общо с това, така че питах защо се занимавате с кода на Грей - каква роля играе той във вашия проблем и/или очаквания отговор?   -  person Ted Hopp    schedule 29.07.2013
comment
да, питах само за числовия ред и реших, че е възможно да се използва сив код.   -  person Pradyut Bhattacharya    schedule 29.07.2013
comment
@PradyutBhattacharya защо не можеш да използваш BitSet?   -  person P0W    schedule 29.07.2013
comment
@P0W bitset... как става това? Намерих също Integer.toBinarystring(1) ..2,3,4 в java   -  person Pradyut Bhattacharya    schedule 29.07.2013


Отговори (1)


Тъй като вашето намерение е просто да отпечатате двоично представяне на числата от

zero to 2^k-1

Ето подхода Biset

public class BitTest {

  public static void main(String args[]) {

    int k = 4;
    BitSet bits;

    for(int x = 0;x< (1<<k) ;x++){
        bits= new BitSet(k);
    int i =  0;
    int v=x;
    while (v > 0) {
      if ( (v % 2) == 1 ) 
    bits.set(i);
      v = v/2;
      i++;
    }
    // print BitSet contents 
    for(i=k-1; i>=0; i--)
      System.out.print(bits.get(i)? 1 : 0);

    System.out.print("\n");
    }
  }
}

Този въпрос беше маркиран по-рано с C++

В C++ това ще бъде още по-ясно:

#include <iostream>
#include <bitset>
#include <climits>
using namespace std;
int main()
{
    const int k=4;
    for(int i=0;i<1<<k;i++){
       bitset<k>    bits(i);
       cout << bits << endl;
    }
}
person P0W    schedule 28.07.2013
comment
оценявам усилията @POW - person Pradyut Bhattacharya; 29.07.2013