Создание всех 3-битных кодов, которые отличаются только одной цифрой от 3-битных кодов

Мне нужно найти все разные 3-битные коды. Это сканирование выполняется с помощью 3 вложенных петель.

Я хочу взять этот массив сгенерированных битовых кодов, а затем вывести все остальные коды, которые отличаются только одним битом. Итак, я пытаюсь создать массив 8 * 3 2d. я знаю, что есть 3 кода, которые будут отличаться только на 1 цифру, но я просто не могу найти способ его закодировать.

Вот что у меня есть до сих пор.

String[] codes = new String[8];
    int count = 0;
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
            for (int k = 0; k < 2; k++) {
                codes[count] = "" + i + j + k;
                count ++;
            }
        }
    }
    String[] code_1 = new String[3];
    String[][] codesNear = new String[8][3];
    for(int h = 0; h < codesNear.length; h ++){
        for(int i = 0 ; i < codes[1].length() ;i ++){
            if (codes[h].charAt(i) == '1' ){
                if (i != 2)
                    codesNear[h][i] = codes[1].substring(0,i) + "0" + codes[1].substring(i+1);
                else codesNear[h][i] = codes[1].substring(0,i) + "0";
            }
            else {
                if (i != 2)
                    codesNear[h][i] = codes[1].substring(0,i) + "1" + codes[1].substring(i+1);
                else codesNear[h][i] = codes[1].substring(0,i) + "1";
            }
        }
    }
    for (String s : codes) {
        System.out.println(s);
    }
    count = 0;
    for(String[] s : codesNear){

        System.out.println("Count" + count + "Code " + codes[count]);
        for(String st : s ){
            System.out.println(st);
        }
        count ++;
    }
}

Результат такой

Count0Code 000
101
011
001
Count1Code 001
101
011
000
Count2Code 010
101
001
001
Count3Code 011
101
001
000
Count4Code 100
001
011
001
Count5Code 101
001
011
000
Count6Code 110
001
001
001
Count7Code 111
001
001
000

Как вы, ребята, видите, результат не правильный. Например, для 000 должно было быть три выхода 100 , 010 , 001 not 101 , 011 ,001

Также можно было бы взять этот код и заставить его читать некоторое число n, а затем находить все различные возможности для длинного двоичного кода n.

Вы пытаетесь сгенерировать код Грея: en.wikipedia.org/wiki/Gray_code?

dkb 19.02.2019 06:19

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

Asad Ishaq 20.02.2019 04:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете упростить это с помощью метода преобразования младших 3 битов целого числа в строку.

String bitString(int n) {
    return new String("" + ((n>>>2)&1) + ((n>>>1)&1) + (n & 1));
}

Затем вы можете использовать побитовое исключающее или против чисел с 1 битом в каждой из битовых позиций (1: 001, 2: 010, 4: 100). Однако немного сложно сказать, хотите ли вы этого из опубликованного вопроса.

String[][] codesNear = new String[8][4];
for(int i = 0; i < 8; i++) {
    codesNear[i][0] = bitString(i);
    codesNear[i][1] = bitString(i ^ 1);
    codesNear[i][2] = bitString(i ^ 2);
    codesNear[i][3] = bitString(i ^ 4);
}

Чтобы ответить на другую часть вопроса из редактирования, да. Тем не менее, битовая строка также должна быть изменена.

int numBit = 3;// or whatever number of bits up to the largest 2^numBit that can be stored in int. 
int numCombinations = 1<<numBits;//2^numBits (here numCombinations == 8)
String[][] codesNear = new String[numCombinations][numBits+1];
for(int i = 0; i < numCombinations; i++) {
    codesNear[i][0] = bitString(i,numBits);
    for(int j = 0; j < numBits; j++) {
        codesNear[i][j+1] = bitString(i ^ (1<<j),numBits);
    }
}

Затем измените битовую строку на это или что-то подобное, чтобы построить строку. Упрощение заключается в смещении числа, чтобы убрать бит, на побитовое и на 1.

String bitString(int n, int numBits) {
    StringBuffer ret = new StringBuffer(numBits);
    for(int i = numBits; i > 0; i--) {
          ret.append((n>>>(i-1))&1);
    }
    return ret.toString();
}

Другие вопросы по теме