2011-11-16 8 views
11

Próbuję przekonwertować liczbę całkowitą na 7-bitową tablicę binarną typu Boolean. Do tej pory kod nie działa: Jeśli wprowadzę liczbę całkowitą 8 do konwersji, zamiast 0001000 otrzymam 1000000, lub powiedz 15 Powinienem uzyskać 0001111, ale dostaję 1111000. Tablica znaków ma inną długość niż tablica binarna a pozycje są błędne.Liczba całkowita do tablicy binarnej

Każda pomoc jest doceniana.

+1

Czy to praca domowa? Użyj podziału i reszty przez 2. – kan

+0

Czy próbowałeś przejść przez kod, ręcznie lub przy użyciu debuggera? Nie powinno być wyzwaniem jeśli użyjesz '8' jako danych wejściowych i pozwoli ci zobaczyć, gdzie twój wynik zaczyna odbiegać od poprawności. –

Odpowiedz

1

Tablica znaków jest dostępna tylko tak długo, jak jest to konieczne, więc tablica boolowska może być dłuższa i umieszcza bity w niewłaściwej pozycji. Zacznij więc od tyłu, a kiedy tablica znaków zostanie zakończona, wypełnij tablicę boolowską zerami do pierwszej pozycji.

2

Wskazówki: Zastanów się, co się dzieje, gdy pojawi się reprezentacja postaci, która ma mniej niż siedem znaków.

W szczególności pomyśl o tym, w jaki sposób tablice char[] i boolean[] są "wyrównane"; w jednym z nich pojawią się dodatkowe elementy, więc w jaki sposób wskaźniki powinny się pokrywać?


Rzeczywista odpowiedź: W tej chwili używasz pierwszy element tablicy znaków jako pierwszego elementu tablicy logicznej, która jest poprawna tylko gdy używasz ciąg siedmiu znaków. W rzeczywistości chcesz, aby elementy tablic pokrywały się (tak, że zera są wyściełane z przodu, a nie na końcu).

Jednym ze sposobów podejścia do tego problemu byłoby obejrzenie indeksów w pętli (np. Opracowanie różnicy wielkości i zmodyfikowanie binaryarray[i + offset]). Ale jeszcze prostszym rozwiązaniem jest pozostawienie po lewej stronie ciągu znaków z zerami, aby mieć dokładnie siedem znaków przed przekształceniem go w tablicę znaków.

(Dodatkowe znaki: co zrobić, gdy w tablicy jest więcej niż 7 znaków, np. Jeśli ktoś podał 200 jako argument? W oparciu o oba powyższe rozwiązania, powinieneś być w stanie łatwo wykryć tę sprawę i obsługiwać ją specjalnie .)

3

Co otrzymasz, gdy wykonasz System.out.println(maxAmpStr); jest "1000" w przypadku 8. Dostajesz tylko odpowiednią część, pierwsza "0000", której oczekiwałeś, została właśnie pominięta.

To nie jest ładne, ale co można zrobić, to:

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; 
    } 
} 
0

Integer.toBinaryString(int i) nie pad. Dla np. Integer.toBinaryString(7) drukuje 111 nie 00000111 zgodnie z oczekiwaniami. Musisz wziąć to pod uwagę przy podejmowaniu decyzji, gdzie rozpocząć wypełnianie tablicy boolowskiej.

+0

Nawet jeśli 'toBinaryString' wydrukował' 00000111', ten program nadal byłby niepoprawny, ponieważ indeksy nie byłyby "wyrównane" pomiędzy tablicami znaków i tablicami logicznymi. (W rzeczywistości nie udałoby się to z wyjątkiem IndexOutOfBoundsException, ale można go było w prosty sposób rozwiązać, pozostawiając podstawowy problem.) –

24

Naprawdę nie ma potrzeby, aby radzić sobie z łańcuchami na to, po prostu zrób bitowe porównań do 7 bitów, które Cię interesują.

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)); 
} 
+4

+1 za tak zwięzły przykład, ale twoja odpowiedź mogłaby zrobić z wyjaśnieniem, dlaczego OP nie działa. – Radiodef

+0

Jestem zainteresowany 200+ bitami, więc to rozwiązanie nie działa. Czy możesz udzielić porady? Czy istnieje sposób pracy z 'boolean []' ('bits') lub czy powinienem spróbować' Strings'? –

0

15.ToBinaryString będzie „1111”

Jesteś przecinanie tego od pierwszego do ostatniego znaku, więc pierwszy "1", który jest bitem (3) przechodzi do binaryArray [0], który zakładam powinien być bitem 0.

możesz ned pad ToBinaryString z wiodącymi zerami do długości 7 (8 ??) a następnie odwrócić ciąg (lub pętle)

Albo można przestać ingerować w ciągi i wystarczy użyć trochę mądrzy operatorzy

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

^= operator mocy lub jeśli nie (1 < < 3) lub cokolwiek innego zostało przesunięte w Javie.

11

byłoby używać tej:

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; 
} 

nr 15 z podstawą 7 spowoduje {fałszywe fałszywe fałszywy, to prawda, prawdziwe prawda prawda} = 0001111b

numer 8, podstawa 7 { false false false true, false false false} = 0001000b

+5

Użycie 'base' tutaj jest trochę mylące, ponieważ binarna jest zawsze podstawowa 2. Być może" długość "byłaby bardziej odpowiednia. W rzeczywistości można obliczyć "długość" jako logiczny C-2 w bazie "liczba". – Martijn

-1
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. a liczba z 1
  2. Dołącz vale na ciąg
  3. zrobić unsigned prawy shift powtórz kroki 1-3 dla i = 30..0
0
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; 
    } 
-1
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]); 
} 
+1

będzie miło, jeśli będziesz mógł dokładniej opisać fragmenty kodu, dzięki czemu lepiej zrozumiesz przyszłych widzów. – Roylee

0

Ponieważ nikt nie ma tutaj odpowiedzi z tablicy dynamicznej długość, tutaj jest moje rozwiązanie:

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; 
}