Целое число в двоичный массив

Я пытаюсь преобразовать целое число в 7-битовый Boolean двоичный массив. Пока код не работает: Если я ввожу слово integer 8, которое нужно преобразовать, вместо 0001000 я получу 1000000, или скажу 15, что я должен получить 0001111, но я получу 1111000. Массив char имеет разную длину для двоичного массива, а позиции неверны.

public static void main(String[] args){

    String maxAmpStr = Integer.toBinaryString(8);
    char[] arr = maxAmpStr.toCharArray();
    boolean[] binaryarray = new boolean[7];
    for (int i=0; i<maxAmpStr.length(); i++){
        if (arr[i] == '1'){             
            binaryarray[i] = true;  
        }
        else if (arr[i] == '0'){
            binaryarray[i] = false; 
        }
    }

    System.out.println(maxAmpStr);
    System.out.println(binaryarray[0]);
    System.out.println(binaryarray[1]);
    System.out.println(binaryarray[2]);
    System.out.println(binaryarray[3]);
    System.out.println(binaryarray[4]);
    System.out.println(binaryarray[5]);
    System.out.println(binaryarray[6]);
}

Любая помощь приветствуется.

Ответ 1

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

public static void main(String[] args) {

    int input = 15;

    boolean[] bits = new boolean[7];
    for (int i = 6; i >= 0; i--) {
        bits[i] = (input & (1 << i)) != 0;
    }

    System.out.println(input + " = " + Arrays.toString(bits));
}

Ответ 2

Я бы использовал это:

private static boolean[] toBinary(int number, int base) {
    final boolean[] ret = new boolean[base];
    for (int i = 0; i < base; i++) {
        ret[base - 1 - i] = (1 << i & number) != 0;
    }
    return ret;
}

число 15 с базой 7 будет генерировать {false, false, false, true, true, true, true} = 0001111b

число 8, основание 7 {false, false, false, true, false, false, false} = 0001000b

Ответ 3

То, что вы получаете, когда вы делаете System.out.println(maxAmpStr);, равно "1000" в случае 8. Таким образом, вы получаете только соответствующую часть, первый "0000", который вы ожидали, просто пропущен.

Это не очень, но что вы можете сделать:

for (int i=0; i<maxAmpStr.length(); i++)
{
    if (arr[i] == '1')
    {
        binaryarray[i+maxAmpStr.length()-1] = true;
    }
    else if (arr[i] == '0')
    {
        binaryarray[i+maxAmpStr.length()-1] = false;
    }
}

Ответ 4

Подсказки: подумайте о том, что произойдет, когда вы получите представление символа, содержащее менее семи символов.

В частности, подумайте о том, как выстраиваются массивы char[] и boolean[] "; будут дополнительные элементы в одном, чем другие, так как должны совпадать индексы?


Фактический ответ: на данный момент вы используете первый элемент массива символов как первый элемент булевого массива, что является правильным только при использовании семисимвольной строки. Фактически, вы хотите, чтобы последние элементы массивов совпадали (так что нули заполняются спереди не в конце).

Один из способов приблизиться к этой проблеме - это поиграть с индексами в цикле (например, выполнить разницу в размерах и изменить binaryarray[i + offset]). Но еще более простое решение - просто оставить строку с нулями после первой строки, чтобы обеспечить ее ровно семь символов, прежде чем преобразовать ее в массив char.

(Дополнительные метки: что вы делаете, когда в массиве содержится более 7 символов, например, если кто-то переходит в 200 в качестве аргумента? Основываясь на обоих вышеприведенных решениях, вы должны легко обнаружить этот случай и обработать его в частности.)

Ответ 5

char -array до тех пор, пока это необходимо, поэтому ваш логический массив может быть длиннее и помещает биты в неправильное положение. Итак, начните со следующего, и когда ваш char -array закончен, заполните ваш логический массив 0 до первой позиции.

Ответ 6

Integer.toBinaryString(int i) не помещается. Напр. Integer.toBinaryString(7) печатает 111 не 00000111, как вы ожидаете. Это необходимо учитывать при принятии решения о том, где начать заполнение булевского массива.

Ответ 7

15.ToBinaryString будет "1111"

Вы промахиваете это от первого до последнего символа, поэтому первый '1', который является битом (3), входит в binaryArray [0], который я предполагаю, должен быть бит 0.

Вам нужно заполнить ToBinaryString с ведущими нулями до длины 7 (8??) и затем измените строку, (или ваш цикл)

Или вы можете перестать возиться со строками и просто использовать бит-мудрые операторы

BinaryArray [3] = (SomeInt & 2 ^ 3!= 0);

^ = оператор мощности, или если нет (1 < 3) или что-то вроде сдвига слева в Java.

Ответ 8

  public static boolean[] convertToBinary(int b){
    boolean[] binArray = new boolean[7];
    boolean bin;
    for(int i = 6; i >= 0; i--) {
      if (b%2 == 1) bin = true;
      else bin = false;
      binArray[i] = bin;
      b/=2;
    }
    return binArray;
  }

Ответ 9

Так как никто не имеет ответа с динамической длиной массива, вот мое решение:

public static boolean[] convertToBinary(int number) {
    int binExpo = 0;
    int bin = 1;
    while(bin < number) { //calculates the needed digits
        bin = bin*2;
        binExpo++;
    }
    bin = bin/2;
    boolean[] binary = new boolean[binExpo]; //array with the right length
    binExpo--;
    while(binExpo>=0) {
        if(bin<=number) {
            binary[binExpo] = true;
            number =number -bin;
            bin = bin/2;
        }else {
            binary[binExpo] = false;
        }
        binExpo--;
    }
    return binary;
}

Ответ 10

    public static String intToBinary(int num) {
    int copy = num;
    String sb = "";
    for(int i=30; i>=0; i--) {
        sb = (copy&1) + sb;
        copy = copy >>>=1;
    }
    return sb;
}
  • И число с 1
  • Добавить строку к строке
  • сделать беззнаковое смещение вправо повторите шаги 1-3 для я = 30..0

Ответ 11

String maxAmpStr = Integer.toBinaryString(255);
    char[] arr = maxAmpStr.toCharArray();
    boolean[] binaryarray = new boolean[20];
    int pivot = binaryarray.length - arr.length;
    int j = binaryarray.length - 1;
    for (int i = arr.length - 1; i >= 0; i--) {
        if (arr[i] == '1') {
            binaryarray[j] = true;
        } else if (arr[i] == '0') {
            binaryarray[j] = false;
        }
        if (j >= pivot)
            j--;
    }

    System.out.println(maxAmpStr);
    for (int k = 0; k < binaryarray.length; k++)
        System.out.println(binaryarray[k]);
}