Programmfehler mit Array

javastudent25

Bekanntes Mitglied
Hallo zusammen

Ich bin neu hier im Forum und benötige etwas Hilfe.
Mein Programm funktioniert irgendwie nicht, weil ich ein Array nicht ausgeben kann. Ich komme offensichtlich über die Arraygrösse hinaus. Ich komme aber nicht ganz drauf, was genau das Problem ist. Ich denke es fängt an mit der Zeile 38, falls das hier später angezeigt wird

Hier ist der Code

Java:
import java.io.*;

public class dezimalzahl {

    public static void main(String[] args) throws IOException {

        // ab hier wird eine Zahl eingelesen und ausgegeben
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);
        System.out.print("Gib eine Zahl ein: ");
        String eingabe = br.readLine();
        int Zahl = Integer.parseInt(eingabe);
        System.out.println("Du hast die Zahl " + Zahl + " eingegeben.");

        // ab hier wird eine Basis eingelesen und ausgegeben
        InputStreamReader isr2 = new InputStreamReader(System.in);
        BufferedReader br2 = new BufferedReader(isr2);
        System.out.print("Gib eine Basis ein: ");
        String eingabe2 = br2.readLine();
        int Basis = Integer.parseInt(eingabe2);
        System.out.println("Du hast die Basis " + Basis + " eingegeben.");

        int Dividend = Zahl;
        int Rest = 0;
        int i = 0;

        while (Dividend > 0) { // notwendige Grösse des Arrays berechnen

            Dividend = Dividend / Basis;
            i++;
        }

        Dividend = Zahl;
        int[] Array = new int[i]; // Array festlegen
        int s = 0;

        while (Dividend >= 0) { // Dividend und Rest (Binärcode = Rest) berechnen mittels Modulo Operator

            Rest = Dividend % Basis;
            Dividend = Dividend / Basis;
            Array[s] = Rest; // Binärcode ins Array von hinten ausgehend schreiben
            s++;
            if (s > 4) {
                Dividend = 0;
            }

        }

        // oder anders
//        for (int a = 0; a <= Array.length; a++) { // Binärcode darstellen
//            if (a > Array.length) {
//                a = Array.length;
//            }
//            System.out.println(Array[a]);
//        }
    }
}
 
Zuletzt bearbeitet:

Tarrew

Top Contributor
Probiers mal mit:
Java:
while (Dividend > 0) {
//...
}
bei der zweiten while-Schleife.

Die if-Abfrage kannste rausnehmen. Aber im Moment schreibst du die Zahlen noch von vorne ausgehend ins Array und nicht wie es in deinem Kommentar steht von hinten ausgehend.

Achja, du solltest dir angewöhnen Variablennamen klein zu schreiben.
 
Zuletzt bearbeitet:

javastudent25

Bekanntes Mitglied
Hallo Tarrew

Vielen Dank für deinen Hinweis. Ich habe den Code angepasst, den Kommentar hatte ich wie es scheint vergessen zu ändern.

Leider funktioniert es immer noch nicht, mein Latein ist hier leider schon zu Ende.
Ich habe absolut keine Ahnung warum das nicht tut.

das ist der Fehler:

Java:
Gib eine Zahl ein: 22
Du hast die Zahl 22 eingegeben.
Gib eine Basis ein: 2
Du hast die Basis 2 eingegeben.
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
    at dezimalzahl.main(dezimalzahl.java:52)

und hier der Code
Java:
import java.io.*;

public class dezimalzahl {

    public static void main(String[] args) throws IOException {

        // ab hier wird eine Zahl eingelesen und ausgegeben
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);
        System.out.print("Gib eine Zahl ein: ");
        String eingabe = br.readLine();
        int zahl = Integer.parseInt(eingabe);
        System.out.println("Du hast die Zahl " + zahl + " eingegeben.");

        // ab hier wird eine Basis eingelesen und ausgegeben
        InputStreamReader isr2 = new InputStreamReader(System.in);
        BufferedReader br2 = new BufferedReader(isr2);
        System.out.print("Gib eine Basis ein: ");
        String eingabe2 = br2.readLine();
        int basis = Integer.parseInt(eingabe2);
        System.out.println("Du hast die Basis " + basis + " eingegeben.");

        int dividend = zahl;
        int rest = 0;
        int i = 0;

        while (dividend > 0) { // notwendige Grösse des Arrays berechnen

            dividend = dividend / basis;
            i++;
        }

        dividend = zahl;
        int[] array = new int[i]; // Array festlegen
        int s = 0;

        while (dividend > 0) { // Dividend und Rest (Binärcode = Rest) berechnen mittels Modulo Operator

            rest = dividend % basis;
            dividend = dividend / basis;
            array[s] = rest; // Binärcode ins Array schreiben
            s++;

        }

      
        for (int a = array.length; a >= 0; a--) { // Binärcode von hinten ausgehend darstellen
            if (a > array.length) {
                a = array.length;
            }
            System.out.print(array[a]); // schreibt alles in eine Zeile
        }
    }
}
 

Tarrew

Top Contributor
Die Berechnung stimmt jetzt, nur deine Ausgabe passt nicht.
Wenn dein Array die Länge 5 hat, dann hast du folgende Einträge:
array[0], array[1], array[2], array[3] und array[4].

In deiner Ausgabe versuchst du aber auf array[5] zuzugreifen.

Und die if-Bedingung kann auch raus ;)
 

javastudent25

Bekanntes Mitglied
So einfach? Cool, vielen Dank Tarrew. Ich denke, ich hätte schon viel eher fragen sollen.
Nochmals vielen Dank ;)

Java:
import java.io.*;

public class dezimalzahl {

    public static void main(String[] args) throws IOException {

        // ab hier wird eine Zahl eingelesen und ausgegeben
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);
        System.out.print("Gib eine Zahl ein: ");
        String eingabe = br.readLine();
        int zahl = Integer.parseInt(eingabe);
        System.out.println("Du hast die Zahl " + zahl + " eingegeben.");

        // ab hier wird eine Basis eingelesen und ausgegeben
        InputStreamReader isr2 = new InputStreamReader(System.in);
        BufferedReader br2 = new BufferedReader(isr2);
        System.out.print("Gib eine Basis ein: ");
        String eingabe2 = br2.readLine();
        int basis = Integer.parseInt(eingabe2);
        System.out.println("Du hast die Basis " + basis + " eingegeben.");

        int dividend = zahl;
        int rest = 0;
        int i = 0;

        while (dividend > 0) { // notwendige Grösse des Arrays berechnen

            dividend = dividend / basis;
            i++;
        }

        dividend = zahl;
        int[] array = new int[i]; // Array festlegen
        int s = 0;

        while (dividend > 0) { // Dividend und Rest (Binärcode = Rest) berechnen mittels Modulo Operator

            rest = dividend % basis;
            dividend = dividend / basis;
            array[s] = rest; // Binärcode ins Array schreiben
            s++;

        }

     
        for (int a = array.length -1; a >= 0; a--) { // Binärcode von hinten ausgehend darstellen
           
             System.out.print(array[a]); // schreibt alles in eine Zeile
        }
    }
}
 

javastudent25

Bekanntes Mitglied
Ich habe noch eine kleine Verständnisfrage:
Ich habe zuvor bei dem Block für die Ermittlung der Basis und der Zahl ein try und catch drin gehabt.
Jedoch hatte ich diese Entfernen müssen, da ich sonst nicht die Zuweisung int dividend = zahl; machen konnte. Das funktioniert ja mit dem try und catch nicht, warum auch immer.
Ich müsste dann entweder im ersten Block oder im 2. Block weitere Operationen vornehmen.
Da ich ja beide Variablen Zahl und Basis benötige funktioniert das ja weder noch..
Ist das so wie ich es beschreibe ungefähr verständlich?
Sprich, wenn try und catch hinzugefügt wird, funktioniert das Programm wie es geschrieben ist leider nicht mehr.
 

javastudent25

Bekanntes Mitglied
Hier ist der Code

Fehler sind Folgende

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
zahl cannot be resolved to a variable
basis cannot be resolved to a variable
zahl cannot be resolved to a variable
basis cannot be resolved to a variable
basis cannot be resolved to a variable

at dezimalzahl.main(dezimalzahl.java:32)


Java:
import java.io.*;

public class dezimalzahl {

    public static void main(String[] args) throws IOException {

        // ab hier wird eine Zahl eingelesen und ausgegeben
        try {
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(isr);
            System.out.print("Gib eine Zahl ein: ");
            String eingabe = br.readLine();
            int zahl = Integer.parseInt(eingabe);
            System.out.println("Du hast die Zahl " + zahl + " eingegeben.");
        } catch (IOException e) {
            e.printStackTrace();
        }

        // ab hier wird eine Basis eingelesen und ausgegeben
        try {
            InputStreamReader isr2 = new InputStreamReader(System.in);
            BufferedReader br2 = new BufferedReader(isr2);
            System.out.print("Gib eine Basis ein: ");
            String eingabe2 = br2.readLine();
            int basis = Integer.parseInt(eingabe2);
            System.out.println("Du hast die Basis " + basis + " eingegeben.");
        } catch (IOException e) {
            e.printStackTrace();
        }

        int dividend = zahl;
        int rest = 0;
        int i = 0;

        while (dividend > 0) { // notwendige Grösse des Arrays berechnen

            dividend = dividend / basis;
            i++;
        }

        dividend = zahl;
        int[] array = new int[i]; // Array festlegen
        int s = 0;

        while (dividend > 0) { // Dividend und Rest (Binärcode = Rest) berechnen
                                // mittels Modulo Operator

            rest = dividend % basis;
            dividend = dividend / basis;
            array[s] = rest; // Binärcode ins Array schreiben
            s++;

        }

        for (int a = array.length - 1; a >= 0; a--) { // Binärcode von hinten
                                                        // ausgehend darstellen

            System.out.print(array[a]); // schreibt alles in eine Zeile
        }
    }
}
 

Tarrew

Top Contributor
Wenn du eine Variable in einem try-catch Block deklarierst ist sie auch nur in dem Block sichtbar und nicht von außerhalb. Du hättest 'zahl' und 'basis' also außerhalb deklarieren müssen.
 

javastudent25

Bekanntes Mitglied
Ok, das ist genau das Problem, das sich mir stellt.
Wo genau muss ich das machen?
Innerhalb der Klasse ist es ja für alle greifbar.

Ich bekomme nun folgende Fehler:

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
Cannot make a static reference to the non-static field zahl
Cannot make a static reference to the non-static field zahl
Cannot make a static reference to the non-static field basis
Cannot make a static reference to the non-static field basis
Cannot make a static reference to the non-static field zahl
Cannot make a static reference to the non-static field basis
Cannot make a static reference to the non-static field zahl
Cannot make a static reference to the non-static field basis
Cannot make a static reference to the non-static field basis

at dezimalzahl.main(dezimalzahl.java:18)

Es ist nun nur ein Teil des Codes dargestellt


Java:
import java.io.*;

public class dezimalzahl {
   
    int zahl;
    int basis;

    public static void main(String[] args) throws IOException {
       

        // ab hier wird eine Zahl eingelesen und ausgegeben
        try {
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(isr);
            System.out.print("Gib eine Zahl ein: ");
            String eingabe = br.readLine();
            zahl = Integer.parseInt(eingabe);
            System.out.println("Du hast die Zahl " + zahl + " eingegeben.");
        } catch (IOException e) {
            e.printStackTrace();
        }

        // ab hier wird eine Basis eingelesen und ausgegeben
        try {
            InputStreamReader isr2 = new InputStreamReader(System.in);
            BufferedReader br2 = new BufferedReader(isr2);
            System.out.print("Gib eine Basis ein: ");
            String eingabe2 = br2.readLine();
            basis = Integer.parseInt(eingabe2);
            System.out.println("Du hast die Basis " + basis + " eingegeben.");
        } catch (IOException e) {
            e.printStackTrace();
        }
 

Tarrew

Top Contributor
Wo sie jetzt stehen sind es Attribute der Klasse. Aber dein gesamter Code steht in der statischen main-Methode. Auf die Attribute hast du nur aus einem nicht-statischem Kontext Zugriff.
Also wenn du dir ein neues Objekt erzeugst zB.
new dezimalzahl().zahl=5; oÄ.

In deinem Beispiel kannst du die Variablen einfach am Anfang der Methode deklarieren.
 

javastudent25

Bekanntes Mitglied
also vor die main Methode gesetzt tut das auch nicht wirklich

rczxxbt9.jpg


Java:
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
    The local variable zahl may not have been initialized
    The local variable basis may not have been initialized
    The local variable zahl may not have been initialized
    The local variable basis may not have been initialized
    The local variable basis may not have been initialized

    at dezimalzahl.main(dezimalzahl.java:35)

Teilcode

Java:
public static void main(String[] args) throws IOException {

        int zahl;
   
        // ab hier wird eine Zahl eingelesen und ausgegeben
        try {
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(isr);
            System.out.print("Gib eine Zahl ein: ");
            String eingabe = br.readLine();
            zahl = Integer.parseInt(eingabe);
            System.out.println("Du hast die Zahl " + zahl + " eingegeben.");
        } catch (IOException e) {
            e.printStackTrace();
        }
   
        int basis;
        // ab hier wird eine Basis eingelesen und ausgegeben
        try {
            InputStreamReader isr2 = new InputStreamReader(System.in);
            BufferedReader br2 = new BufferedReader(isr2);
            System.out.print("Gib eine Basis ein: ");
            String eingabe2 = br2.readLine();
            basis = Integer.parseInt(eingabe2);
            System.out.println("Du hast die Basis " + basis + " eingegeben.");
        } catch (IOException e) {
            e.printStackTrace();
        }
 
Zuletzt bearbeitet:

Tarrew

Top Contributor
Wenn man das nicht machen müsste, dann könnte sowas passieren:
Java:
        int zahl;
        try{
            int a = 5/0;
            zahl=a;
        }catch(Exception e){
            e.printStackTrace();
        }
        System.out.println(zahl);

zahl=a wird garnicht mehr ausgeführt weil vorher eine Exception geworfen wird.
Später versuchst du aber nochmal auf die Variable zuzugreifen. Diese hat aber unter Umständen garkeinen Wert (wie genau in diesem Fall).

Bei dir kann das gleiche passieren. Bevor du in deinem try-Block zu der Zuweisung kommst, könnte eine Exception geworfen worden sein. Dann wird die Zuweisung nicht vorgenommen und die Variable hat bei deinem späteren Zugriff darauf keinen Wert. Deswegen muss sie vorher initialisiert werden.
 

javastudent25

Bekanntes Mitglied
Achso, weil die Exception kommt und dann sofort in der try Funktion alles Folgende ignoriert wird, alles klar ;)
dann kann morgen die nächste Übung vorgenommen werden.
Ich bin noch sowas von grün hinter den Ohren, was das Programmieren angeht. :p
Vielen Dank
 

javastudent25

Bekanntes Mitglied
Hier ist der korrekte Code für Interessierte

Java:
import java.io.*;

//Dieses Programm wandelt eine Dezimalzahl je nach Basis in einen Binärcode um, wobei anzumerken ist, dass die Basis 16 hier nicht mehr
//korrekt funktioniert, da die Angaben >10 nicht mit Buchstaben A-F erfolgen

public class dezimalzahl {

    public static void main(String[] args) throws IOException {

        int zahl=0;
      
        // ab hier wird eine Zahl eingelesen und ausgegeben
        try {
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(isr);
            System.out.print("Gib eine Zahl ein: ");
            String eingabe = br.readLine();
            zahl = Integer.parseInt(eingabe);
            System.out.println("Du hast die Zahl " + zahl + " eingegeben.");
        } catch (IOException e) {
            e.printStackTrace();
        }
      
        int basis=0;
        // ab hier wird eine Basis eingelesen und ausgegeben
        try {
            InputStreamReader isr2 = new InputStreamReader(System.in);
            BufferedReader br2 = new BufferedReader(isr2);
            System.out.print("Gib eine Basis ein: ");
            String eingabe2 = br2.readLine();
            basis = Integer.parseInt(eingabe2);
            System.out.println("Du hast die Basis " + basis + " eingegeben.");
        } catch (IOException e) {
            e.printStackTrace();
        }

        int dividend = zahl;
        int rest = 0;
        int i = 0;

        while (dividend > 0) { // notwendige Grösse des Arrays berechnen

            dividend = dividend / basis;
            i++;
        }

        dividend = zahl;
        int[] array = new int[i]; // Array festlegen
        int s = 0;

        while (dividend > 0) { // Dividend und Rest (Binärcode = Rest) berechnen
                                // mittels Modulo Operator

            rest = dividend % basis;
            dividend = dividend / basis;
            array[s] = rest; // Binärcode ins Array schreiben
            s++;

        }

        for (int a = array.length - 1; a >= 0; a--) { // Binärcode von hinten
                                                        // ausgehend darstellen

            System.out.print(array[a]); // schreibt alles in eine Zeile
        }
    }
}
 
Zuletzt bearbeitet von einem Moderator:

javastudent25

Bekanntes Mitglied
Ich konnte leider keine Ruhe geben.
Ich dachte, das geht sicher schnell, aber das ist die Variante die mir auf die Schnelle eingefallen ist.
Eine Bessere habe ich leider nicht.
Das mit dem char funktioniert irgendwie nicht im 2. while.


Java:
import java.io.*;

//Dieses Programm wandelt eine Dezimalzahl je nach Basis in einen Binärcode um, wobei anzumerken ist, dass die Basis 16 hier nicht mehr
//korrekt funktioniert, da die Angaben >10 nicht mit Buchstaben A-F erfolgen

public class dezimalzahl {

    public static void main(String[] args) throws IOException {

        int zahl = 0;

        // ab hier wird eine Zahl eingelesen und ausgegeben
        try {
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(isr);
            System.out.print("Gib eine Zahl ein: ");
            String eingabe = br.readLine();
            zahl = Integer.parseInt(eingabe);
            System.out.println("Du hast die Zahl " + zahl + " eingegeben.");
        } catch (IOException e) {
            e.printStackTrace();
        }

        int basis = 0;
        // ab hier wird eine Basis eingelesen und ausgegeben
        try {
            InputStreamReader isr2 = new InputStreamReader(System.in);
            BufferedReader br2 = new BufferedReader(isr2);
            System.out.print("Gib eine Basis ein: ");
            String eingabe2 = br2.readLine();
            basis = Integer.parseInt(eingabe2);
            System.out.println("Du hast die Basis " + basis + " eingegeben.");
        } catch (IOException e) {
            e.printStackTrace();
        }

        int dividend = zahl;
        int rest = 0;
        int i = 0;

        while (dividend > 0) { // notwendige Grösse des Arrays berechnen

            dividend = dividend / basis;
            i++;
        }

        dividend = zahl;
        int[] array = new int[i]; // Array festlegen
        int s = 0;

        while (dividend > 0) { // Dividend und Rest (Binärcode = Rest) berechnen
                                // mittels Modulo Operator

            rest = dividend % basis;
            dividend = dividend / basis;
            char v;
            array[s] = rest; // Binärcode ins Array schreiben
            if (basis == 16) {
                if (rest == 10) {
                    v = 65;
                    array[s] = v;
                } else if (rest == 11) {
                    v = 66;
                    array[s] = v;
                } else if (rest == 12) {
                    v = 67;
                    array[s] = v;
                } else if (rest == 13) {
                    v = 68;
                    array[s] = v;
                } else if (rest == 14) {
                    v = 69;
                    array[s] = v;
                } else if (rest == 15) {
                    v = 70;
                    array[s] = v;
                }
              
                s++;

            }

            for (int a = array.length - 1; a >= 0; a--) { // Binärcode von
                                                            // hinten
                                                            // ausgehend
                                                            // darstellen

                System.out.print(array[a]); // schreibt alles in eine Zeile
            }
        }
    }
}
 
Zuletzt bearbeitet von einem Moderator:

javastudent25

Bekanntes Mitglied
Hallo zusammen
Ich habe heute noch versucht aus dem Int einen Char Array zu machen.
Jedoch kommt mir dann ein Fehler: Type mismatch: cannot convert from int to char.
Ich kann ja den Rest den ich berechne und die Variablen, die davon abhängen, nicht auch noch char setzen, weil ich ja werte > 255 (unsigned) verwenden möchte. Es kann ja sein, dass jemand 1000 eingibt.
Ausserdem schaffe ich es irgendwie nicht, dass mir beispielsweise der ASCII Code 70 den Buchstaben F ausgibt.
Vielen Dank
 

javastudent25

Bekanntes Mitglied
ag4ebiul.jpg


Ich habe die Änderung in Zeile 49 gemacht

Hier ist der Code:

Java:
import java.io.*;

//Dieses Programm wandelt eine Dezimalzahl je nach Basis in einen Binärcode um, wobei anzumerken ist, dass die Basis 16 hier nicht mehr
//korrekt funktioniert, da die Angaben >10 nicht mit Buchstaben A-F erfolgen

public class dezimalzahl {

    public static void main(String[] args) throws IOException {

        int zahl = 0;

        // ab hier wird eine Zahl eingelesen und ausgegeben
        try {
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(isr);
            System.out.print("Gib eine Zahl ein: ");
            String eingabe = br.readLine();
            zahl = Integer.parseInt(eingabe);
            System.out.println("Du hast die Zahl " + zahl + " eingegeben.");
        } catch (IOException e) {
            e.printStackTrace();
        }

        int basis = 0;
        // ab hier wird eine Basis eingelesen und ausgegeben
        try {
            InputStreamReader isr2 = new InputStreamReader(System.in);
            BufferedReader br2 = new BufferedReader(isr2);
            System.out.print("Gib eine Basis ein: ");
            String eingabe2 = br2.readLine();
            basis = Integer.parseInt(eingabe2);
            System.out.println("Du hast die Basis " + basis + " eingegeben.");
        } catch (IOException e) {
            e.printStackTrace();
        }

        int dividend = zahl;
        int rest = 0;
        int i = 0;

        while (dividend > 0) { // notwendige Grösse des Arrays berechnen

            dividend = dividend / basis;
            i++;
        }

        dividend = zahl;
        char[] array = new char[i]; // Array festlegen
        int s = 0;

        while (dividend > 0) { // Dividend und Rest (Binärcode = Rest) berechnen
                                // mittels Modulo Operator

            rest = dividend % basis;
            dividend = dividend / basis;
            char v;
            array[s] = rest; // Binärcode ins Array schreiben
            if (basis == 16) {
                if (rest == 10) {
                    v = 65;
                    array[s] = v;
                } else if (rest == 11) {
                    v = 66;
                    array[s] = v;
                } else if (rest == 12) {
                    v = 67;
                    array[s] = v;
                } else if (rest == 13) {
                    v = 68;
                    array[s] = v;
                } else if (rest == 14) {
                    v = 69;
                    array[s] = v;
                } else if (rest == 15) {
                    v = 70;
                    array[s] = v;
                }
              
                s++;

            }

            for (int a = array.length - 1; a >= 0; a--) { // Binärcode von
                                                            // hinten
                                                            // ausgehend
                                                            // darstellen

                System.out.print(array[a]); // schreibt alles in eine Zeile
            }
        }
    }
}
 

InfectedBytes

Top Contributor
rest ist nunmal ein int (32 bit ganzzahl mit vorzeichen)
array[s] ist ein char (16bit ganzzahl ohne vorzeichen)
du kannst "größere" datentypen nicht einfach einem kleineren zuweisen. Da potentiell informationen verloren gehen könnten, musst du einen expliziten typecast durchführen:
Java:
array[s] = (char)rest;
 

javastudent25

Bekanntes Mitglied
Hallo InfectedByte ;)
Ok, ich verstehe, danke vielmals für deine Hilfe. Aber das wirft gerade einige Fragen auf.
Wenn mein Rest nun angenommen nur gering grösser ist als eine 16Bit Zahl, dann habe ich bereits da schon einen Fehler drin, obwohl ich das so casten und anpassen kann. Mit dem Cast ist also nicht garantiert, dass mein Rest auch wirklich immer in den Char Array passt. Verstehe ich das richtig? Kann ich überhaupt ein Array generieren, das Zeichen enthalten kann und grösser ist als 16Bit? Oder bin ich mit dem Array auf diese Dimension beschränkt?
 

javastudent25

Bekanntes Mitglied
Nach langem Hin und Her funktioniert übrigens nun zwar der Cast, aber wenn ich die If-Bedingung mit dem A-F einfachheitshalber weglasse, funktioniert so nicht einmal mehr meine Binärcodedarstellung.

Java:
import java.io.*;

//Dieses Programm wandelt eine Dezimalzahl je nach Basis in einen Binärcode um, wobei anzumerken ist, dass die Basis 16 hier nicht mehr
//korrekt funktioniert, da die Angaben >10 nicht mit Buchstaben A-F erfolgen

public class dezimalzahl {

    public static void main(String[] args) throws IOException {

        int zahl = 0;

        // ab hier wird eine Zahl eingelesen und ausgegeben
        try {
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(isr);
            System.out.print("Gib eine Zahl ein: ");
            String eingabe = br.readLine();
            zahl = Integer.parseInt(eingabe);
            System.out.println("Du hast die Zahl " + zahl + " eingegeben.");
        } catch (IOException e) {
            e.printStackTrace();
        }

        int basis = 0;
        // ab hier wird eine Basis eingelesen und ausgegeben
        try {
            InputStreamReader isr2 = new InputStreamReader(System.in);
            BufferedReader br2 = new BufferedReader(isr2);
            System.out.print("Gib eine Basis ein: ");
            String eingabe2 = br2.readLine();
            basis = Integer.parseInt(eingabe2);
            System.out.println("Du hast die Basis " + basis + " eingegeben.");
        } catch (IOException e) {
            e.printStackTrace();
        }

        int dividend = zahl;
        int rest = 0;
        int i = 0;

        while (dividend > 0) { // notwendige Grösse des Arrays berechnen

            dividend = dividend / basis;
            i++;
        }

        dividend = zahl;
        char[] array = new char[i]; // Array festlegen
        int s = 0;

        while (dividend > 0) { // Dividend und Rest (Binärcode = Rest) berechnen
                                // mittels Modulo Operator

            rest = dividend % basis;
            dividend = dividend / basis;
            array[s] = (char) rest;    // Binärcode ins Array schreiben
            s++;

            }

            for (int a = array.length - 1; a >= 0; a--) { // Binärcode von
                                                            // hinten
                                                            // ausgehend
                                                            // darstellen

                System.out.print(array[a]); // schreibt alles in eine Zeile
            }
        }
    }
 
Zuletzt bearbeitet von einem Moderator:

Tarrew

Top Contributor
Du schreibst den Rest als char ins Array.
Wenn du hinterher '0' und '1' in deinem Array hast und das ausgibst dann kommen da unlesbare Zeichen raus, weil eben die Zeichen mit dem ASCII-Wert '0' und '1' ausgegeben werden.

Wenn du wieder auf die Zahlen kommen willst musst du 48 draufrechnen:
Java:
System.out.print((char)(array[a]+48));
 

javastudent25

Bekanntes Mitglied
Wenn ich es so mache, wie du es angegeben hast dann funktioniert es.
Jedoch aber, wenn ich wieder die if Bedingungen wegen diesen A-F Bezeichnungen hinzufüge, stimmt nicht einmal mehr die Binärcodedarstellung.

Ich versteh das einfach nicht. Da die If Anweisung nur dann bearbeitet werden soll, wenn die Basis 16 ist. Das sollte eigentlich keine Auswirkung auf die Binärcodedarstellung mit der Basis 2 oder alles andere haben ausser 16.


Java:
import java.io.*;

//Dieses Programm wandelt eine Dezimalzahl je nach Basis in einen Binärcode um, wobei anzumerken ist, dass die Basis 16 hier nicht mehr
//korrekt funktioniert, da die Angaben >10 nicht mit Buchstaben A-F erfolgen

public class dezimalzahl {

    public static void main(String[] args) throws IOException {

        int zahl = 0;

        // ab hier wird eine Zahl eingelesen und ausgegeben
        try {
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(isr);
            System.out.print("Gib eine Zahl ein: ");
            String eingabe = br.readLine();
            zahl = Integer.parseInt(eingabe);
            System.out.println("Du hast die Zahl " + zahl + " eingegeben.");
        } catch (IOException e) {
            e.printStackTrace();
        }

        int basis = 0;
        // ab hier wird eine Basis eingelesen und ausgegeben
        try {
            InputStreamReader isr2 = new InputStreamReader(System.in);
            BufferedReader br2 = new BufferedReader(isr2);
            System.out.print("Gib eine Basis ein: ");
            String eingabe2 = br2.readLine();
            basis = Integer.parseInt(eingabe2);
            System.out.println("Du hast die Basis " + basis + " eingegeben.");
        } catch (IOException e) {
            e.printStackTrace();
        }

        int dividend = zahl;
        int rest = 0;
        int i = 0;

        while (dividend > 0) { // notwendige Grösse des Arrays berechnen

            dividend = dividend / basis;
            i++;
        }

        dividend = zahl;
        char[] array = new char[i]; // Array festlegen
        int s = 0;
        char v;

        while (dividend > 0) { // Dividend und Rest (Binärcode = Rest) berechnen
                                // mittels Modulo Operator

            rest = dividend % basis;
            dividend = dividend / basis;
            array[s] = (char) rest;    // Binärcode ins Array schreiben
            if (basis == 16) {
                if (rest == 10) {
                    v = 65;
                    array[s] = v;
                } else if (rest == 11) {
                    v = 66;
                    array[s] = v;
                } else if (rest == 12) {
                    v = 67;
                    array[s] = v;
                } else if (rest == 13) {
                    v = 68;
                    array[s] = v;
                } else if (rest == 14) {
                    v = 69;
                    array[s] = v;
                } else if (rest == 15) {
                    v = 70;
                    array[s] = v;
                }
            s++;

            }

            for (int a = array.length - 1; a >= 0; a--) { // Binärcode von
                                                            // hinten
                                                            // ausgehend
                                                            // darstellen

                System.out.print((char) (array[a]+48)); // schreibt alles in eine Zeile
            }
        }
    }
}

das ist das Ergebnis

Gib eine Zahl ein: 22
Du hast die Zahl 22 eingegeben.
Gib eine Basis ein: 2
Du hast die Basis 2 eingegeben.
0000000001000010000000001
 

javastudent25

Bekanntes Mitglied
cool, danke. :)
die Binärcodedarstellung zB mit 2 funktioniert jetzt, aber mit 16 bekomme ich folgendes nach der Eingabe.
Wieso v? v hat doch einen Wert...
Ich frage mich langsam, ob das Programmieren mit den Typen so heikel ist oder ich einfach zu blöde bin dafür..

Gib eine Zahl ein: 15
Du hast die Zahl 15 eingegeben.
Gib eine Basis ein: 16
Du hast die Basis 16 eingegeben.
v


Java:
import java.io.*;

//Dieses Programm wandelt eine Dezimalzahl je nach Basis in einen Binärcode um, wobei anzumerken ist, dass die Basis 16 hier nicht mehr
//korrekt funktioniert, da die Angaben >10 nicht mit Buchstaben A-F erfolgen

public class dezimalzahl {

    public static void main(String[] args) throws IOException {

        int zahl = 0;

        // ab hier wird eine Zahl eingelesen und ausgegeben
        try {
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(isr);
            System.out.print("Gib eine Zahl ein: ");
            String eingabe = br.readLine();
            zahl = Integer.parseInt(eingabe);
            System.out.println("Du hast die Zahl " + zahl + " eingegeben.");
        } catch (IOException e) {
            e.printStackTrace();
        }

        int basis = 0;
        // ab hier wird eine Basis eingelesen und ausgegeben
        try {
            InputStreamReader isr2 = new InputStreamReader(System.in);
            BufferedReader br2 = new BufferedReader(isr2);
            System.out.print("Gib eine Basis ein: ");
            String eingabe2 = br2.readLine();
            basis = Integer.parseInt(eingabe2);
            System.out.println("Du hast die Basis " + basis + " eingegeben.");
        } catch (IOException e) {
            e.printStackTrace();
        }

        int dividend = zahl;
        int rest = 0;
        int i = 0;

        while (dividend > 0) { // notwendige Grösse des Arrays berechnen

            dividend = dividend / basis;
            i++;
        }

        dividend = zahl;
        char[] array = new char[i]; // Array festlegen
        int s = 0;
        char v;

        while (dividend > 0) { // Dividend und Rest (Binärcode = Rest) berechnen
                                // mittels Modulo Operator

            rest = dividend % basis;
            dividend = dividend / basis;
            array[s] = (char) rest; // Binärcode ins Array schreiben
            if (basis == 16) {
                if (rest == 10) {
                    v = 65;
                    array[s] = v;
                } else if (rest == 11) {
                    v = 66;
                    array[s] = v;
                } else if (rest == 12) {
                    v = 67;
                    array[s] = v;
                } else if (rest == 13) {
                    v = 68;
                    array[s] = v;
                } else if (rest == 14) {
                    v = 69;
                    array[s] = v;
                } else if (rest == 15) {
                    v = 70;
                    array[s] = v;
                }

            }
            s++;
        }

        for (int a = array.length - 1; a >= 0; a--) { // Binärcode von
                                                        // hinten
                                                        // ausgehend
                                                        // darstellen

            System.out.print((char) (array[a] + 48)); // schreibt alles in eine
                                                        // Zeile
        }
    }
}
 
Zuletzt bearbeitet von einem Moderator:

Tarrew

Top Contributor
Weil du am Ende wieder 48 draufählst.
70+48=118 und 118 ist der ASCII-Wert für 'v'.

Einfacher wäre es so:
Java:
            if (basis == 16) {
                if (rest >= 10) {
                    array[s] = (char) (rest + 7);
                }
            }
 
Zuletzt bearbeitet:

javastudent25

Bekanntes Mitglied
vielen vielen Dank, es hat funktioniert, jetzt habe ich das mit den Typen mal richtig verstanden ;)

Gib eine Zahl ein: 255
Du hast die Zahl 255 eingegeben.
Gib eine Basis ein: 16
Du hast die Basis 16 eingegeben.
Der Code lautet: FF

Hier ist der vollständige Code

Java:
import java.io.*;

//Dieses Programm wandelt eine Dezimalzahl je nach Basis in einen Binärcode bzw. Hexadezimalsystem um

public class dezimalzahl {

    public static void main(String[] args) throws IOException {

        int zahl = 0;

        // ab hier wird eine Zahl eingelesen und ausgegeben
        try {
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(isr);
            System.out.print("Gib eine Zahl ein: ");
            String eingabe = br.readLine();
            zahl = Integer.parseInt(eingabe);
            System.out.println("Du hast die Zahl " + zahl + " eingegeben.");
        } catch (IOException e) {
            e.printStackTrace();
        }

        int basis = 0;
        // ab hier wird eine Basis eingelesen und ausgegeben
        try {
            InputStreamReader isr2 = new InputStreamReader(System.in);
            BufferedReader br2 = new BufferedReader(isr2);
            System.out.print("Gib eine Basis ein: ");
            String eingabe2 = br2.readLine();
            basis = Integer.parseInt(eingabe2);
            System.out.println("Du hast die Basis " + basis + " eingegeben.");
        } catch (IOException e) {
            e.printStackTrace();
        }

        int dividend = zahl;
        int rest = 0;
        int i = 0;

        while (dividend > 0) { // notwendige Grösse des Arrays berechnen

            dividend = dividend / basis;
            i++;
        }

        dividend = zahl;
        char[] array = new char[i]; // Array festlegen
        int s = 0;
        char v;

        while (dividend > 0) { // Dividend und Rest (Binärcode = Rest) berechnen
                                // mittels Modulo Operator

            rest = dividend % basis;
            dividend = dividend / basis;
            array[s] = (char) rest; // Binärcode ins Array schreiben
            if (basis == 16 && rest >= 10) {
                array[s] = (char) (rest + 7); // rest + 7 deshalb, weil am
                                                // Schluss nach while() 48
                                                // dazugezählt wird und
                                                // 48+rest+7 ergibt genau 65 im
                                                // AsCii Code für A
            }
            s++;
        }

        System.out.print("Der Code lautet: ");

        for (int a = array.length - 1; a >= 0; a--) { // Binärcode von
                                                        // hinten
                                                        // ausgehend
                                                        // darstellen

            System.out.print(((char) (array[a] + 48))); // schreibt alles in
                                                        // eine
                                                        // Zeile
        }
    }
}
 
Zuletzt bearbeitet von einem Moderator:

Tarrew

Top Contributor
Guck mal den Code aus meinem Beitrag weiter oben ;)
Java:
if(basis == 16 && rest>=10){
    array[s]=(char)(rest +7)
}

Das erspart dir deine ganzen if-else.
 

javastudent25

Bekanntes Mitglied
Du bist Schlau wie ein Fuchs. Schon angepasst
Das ist halt das was einen guten Programmierer irgendwo ausmacht.
Ich bin mir auch sicher, dass du oder Andere das Programm auch in wenigen Zeilen schreiben könnten.
Aber vorerst bin ich zufrieden. Es geht ja noch nicht darum, den kürzesten Weg zu nehmen... :)
noch.. :p
 

Flown

Administrator
Mitarbeiter
Also generell würde ich die Konvertierung in eine Methode auslagern. Statt den BufferedInputStream würde ich auch einen Scanner verwenden.
Nachdem das jetzt auch schon fast richtig aussieht zeige ich dir mal ein paar Verbesserungsvorschläge:
Java:
import java.util.Scanner;

public class Test {
   
   public static void main(String... args) {
     final Scanner sc = new Scanner(System.in);
     System.out.print("Number to convert: ");
     int n = sc.nextInt();
     System.out.print("Base: ");
     int base = sc.nextInt();
     System.out.println("The number " + n + " to base " + base + ": " + decimalToBase(n, base));
   }
   
   public static String decimalToBase(int n, int base) {
     StringBuilder sb = new StringBuilder();
     do {
       int digit = n % base;
       sb.insert(0, (char) (digit < 10 ? '0' + digit : 'a' + digit - 10));
       n /= base;
     } while (n != 0);
     return sb.toString();
   }
}
 

javastudent25

Bekanntes Mitglied
Also generell würde ich die Konvertierung in eine Methode auslagern. Statt den BufferedInputStream würde ich auch einen Scanner verwenden.
Nachdem das jetzt auch schon fast richtig aussieht zeige ich dir mal ein paar Verbesserungsvorschläge:
Java:
import java.util.Scanner;

public class Test {
 
   public static void main(String... args) {
     final Scanner sc = new Scanner(System.in);
     System.out.print("Number to convert: ");
     int n = sc.nextInt();
     System.out.print("Base: ");
     int base = sc.nextInt();
     System.out.println("The number " + n + " to base " + base + ": " + decimalToBase(n, base));
   }
 
   public static String decimalToBase(int n, int base) {
     StringBuilder sb = new StringBuilder();
     do {
       int digit = n % base;
       sb.insert(0, (char) (digit < 10 ? '0' + digit : 'a' + digit - 10));
       n /= base;
     } while (n != 0);
     return sb.toString();
   }
}

Hallo
Vielen Dank noch für deine Mühe, aber mir stellen sich nun folgende Fragen:
1. Kannst du mir sagen, warum der Scanner hier besser sein soll?
2. Warum steht vor dem Scanner "final"?

Das war beim InputStreamReader auch so aber
3. Warum schreibt man in die Klammern immer das (System.in) als Parameter?
4. Warum ist deine Methode nun static?
5. Woher weiss ich, in welcher Library welche Klassen stecken und welche in einfügen muss?

Es gibt hier offensichtlich eine Klasse StringBuilder. Du erzeugst dir ein Objekt StringBuilder.
Dann berechnest du digit, aber dieses ändert sich ja nie, weil du n nie überschreibst.
6. Was du in den 2 Zeilen dann vor dem while machst, weiss ich leider überhaupt nicht..

Ich wäre dir dankbar, wenn du mich aufklären könntest.
 

Flown

Administrator
Mitarbeiter
1. Scanner beinhaltet genau die Funktionalität die du benötigst (exemplarisch: Integer.parseInt(BufferedReader.readLine()) <=> Scanner.nextInt())
2. Du verwendest bei deinem Code zwei BufferedReader auf den selben InputStream. Das ist unnötig du könntest einen verwenden. final bedeutet, dass die Variable sc nicht mehr verändert werden kann (war ein überbleibsel meines Autoformatting von Eclipse). n und base könnten übrigens auch final sein.

3. Weil es auch noch andere InputStreams gibt (z.B. Files, Internet Daten, etc.). System.in ist die Konstante für den InputHandle für die Konsole.
4. Zu Einem, da die Methode nur von ihren Parameter abhängig und nicht von dem umgebenden Objekt ist, ist sie static. Zum Anderen, da kann ich sieh von der statischen main-Methode aufrufen ohne ein Objekt anlegen zu müssen.
5. Erfahrung/Bücher/Tutorials/Google/... vor allem aber die Java Dokumentation

6. Dies nennt sich ein do-while Schleife und wird hingegen zu einer gewöhnlichen while Schleife mindestens einmal ausgeführt (zum Beispiel die Zahl 0 muss auch "0" zurückliefern).

Noch Fragen?
 

javastudent25

Bekanntes Mitglied
Hallo
Sei mir nicht böse, aber ich bin leider was das Programmieren mit Java und sonst auch angeht nicht so tief in der Materie drin und ich möchte hiermit sicher auch nicht sagen, dass deine Erklärungsweisen anzuzweifeln sind. Das Problem liegt sicher bei mir..
Aber Tatsache ist, dass ich nun von all den ganzen Punkten nur die Nummer 5 richtig verstanden habe. Wenn ich alles andere so lese verstehe ich ehrlich gesagt nur Bahnhof. :(
 

javastudent25

Bekanntes Mitglied
1. Scanner beinhaltet genau die Funktionalität die du benötigst (exemplarisch: Integer.parseInt(BufferedReader.readLine()) <=> Scanner.nextInt())
2. Du verwendest bei deinem Code zwei BufferedReader auf den selben InputStream. Das ist unnötig du könntest einen verwenden. final bedeutet, dass die Variable sc nicht mehr verändert werden kann (war ein überbleibsel meines Autoformatting von Eclipse). n und base könnten übrigens auch final sein.

3. Weil es auch noch andere InputStreams gibt (z.B. Files, Internet Daten, etc.). System.in ist die Konstante für den InputHandle für die Konsole.
4. Zu Einem, da die Methode nur von ihren Parameter abhängig und nicht von dem umgebenden Objekt ist, ist sie static. Zum Anderen, da kann ich sieh von der statischen main-Methode aufrufen ohne ein Objekt anlegen zu müssen.
5. Erfahrung/Bücher/Tutorials/Google/... vor allem aber die Java Dokumentation

6. Dies nennt sich ein do-while Schleife und wird hingegen zu einer gewöhnlichen while Schleife mindestens einmal ausgeführt (zum Beispiel die Zahl 0 muss auch "0" zurückliefern).

Noch Fragen?

Hallo Flown
Ich habe mich so nach deinem Beitrag nun im Internet etwas angelesen.
Die meisten meiner Fragen kann ich denke ich mit deinem Beitrag auch nun mir selbst beantworten.
Bitte korrigiere mich, wenn ich falsch liege.

Zu Punkt
1.) weiss ich jetzt was du meinst. Dazu hab ich vor einen neuen Thread zu machen und dort die Frage nochmals zu stellen.
2.) final verwende ich also, wie du auch angedeutet hast, für Variablen, die nur einmal deklariert werden und sich nie wieder ändern. Das kann entweder manuell oder durch Parameter geschehen.
3.) System.in dient also lediglich dazu, um anzugeben wie der ParameterInput stattfinden soll. In diesem Fall wie auch du es sagst, über die Konsole direkt..
4.) static verwendet man zB für Variablen oder Methoden, die entweder direkt von der Main_Methode aus gesteuert werden sollten, ohne ein Objekt zu erstellen oder einfach Variablen allgemein gültig zu verändern, sprich wenn in einer Superklasse eine Variable static definiert ist und diese verändert wird, so gilt diese für alle folgenden Subklassen, aber auch für jene die bereits erstellt worden waren.
5. hatte ich ja verstanden :p
6. was diese beiden Zeilen bedeuten, habe ich immer noch nicht herausgefunden
sb.insert(0, (char)(digit <10?'0'+ digit :'a'+ digit -10));
n /= base;

Vielleich kannst du mir da mal erklären, was du genau machst
was bedeutet /=?
was macht die insert Funktion in der Klammer?

und übrigens einen gutes Neues wünsche ich allen Lesenden ;)
hoffe ihr seid gut rüber gekommen :)
 

Tarrew

Top Contributor
6.:
Das erste nennt sich ternärer Operator.
Du kannst es auch so schreiben:
Java:
        if(digit<10){
            sb.insert(0,  (char)'0'+digit);
        }else{
            sb.insert(0,  (char)'a'+digit-10);
        }

Java:
n/=base;
ist die Kurzschreibweise für
Java:
n=n/base;


Und danke gleichfalls ;)
 

javastudent25

Bekanntes Mitglied
Hallo InfectedByte ;)
Ok, ich verstehe, danke vielmals für deine Hilfe. Aber das wirft gerade einige Fragen auf.
Wenn mein Rest nun angenommen nur gering grösser ist als eine 16Bit Zahl, dann habe ich bereits da schon einen Fehler drin, obwohl ich das so casten und anpassen kann. Mit dem Cast ist also nicht garantiert, dass mein Rest auch wirklich immer in den Char Array passt. Verstehe ich das richtig? Kann ich überhaupt ein Array generieren, das Zeichen enthalten kann und grösser ist als 16Bit? Oder bin ich mit dem Array auf diese Dimension beschränkt?

Hab grad festgestellt, dass diese Frage noch offen ist.
Hat vllt. jemand Lust das noch zu erläutern?
 

InfectedBytes

Top Contributor
rest hast du wie folgt definiert:
rest = divident % basis
Deine divident ist eine positive ganze zahl und durch die modulo operation kann der rest nur zwischen 0 und basis-1 liegen.
Wenn deine Basis z.B. 10 ist, dann ist der rest immer zwischen 0 und 9

Solange deine Basis also nicht größer als 65535 ist, ist also alles gut^^
 

javastudent25

Bekanntes Mitglied
Hi
vielen Dank, aber meine Frage war eher allgemein gestellt bei casten.
aber deinen beitrag richtig interpretiert heisst das also, wenn ich einen Long zB in einen int caste, dann muss ich das Programm gut kennen, über alle Fälle Bescheid wissen und garantieren, dass also die gecastete Zahl immer kleiner ist als der Typ insgesamt Grösse zur Verfügung bereit stellt.
 
K

kneitzel

Gast
Das ist nur bedingt richtig. Aber Du musst genau verstehen, was Du machst und dass eben keine Informationen verloren gehen, die wichtig gewesen wären.

Beispiel: War erst gestern in einem anderen Thread: Umwandlung eines Integers in ein Byte-Array. Eine Möglichkeit dazu war, den Integer Wert (der aus 4 Bytes besteht) mehrfach in ein byte zu casten (wobei auch 3 mal die Bits verschoben waren) - und bei diesen Casts als auch bei den Bit-Verschiebungen gingen Daten verloren. Aber dies war so gewollt und durch den Code wurde sicher gestellt, das eben keine Daten verloren gegangen sind.

Konrad
 

javastudent25

Bekanntes Mitglied
:) danke euch beiden.

Konrad, kannst du mir das mit dem 4 Byte Integer mehrfach in 1 byte casten nochmals irgendwie anders erklären?

ich habe also eine

1111 1111 1111 1111 1111 1111 1111 1111

Zahl und diese wird mehrmach in ein Byte

1111 1111

gecastet.
Also darf jene Zahl, die gerade gecastet wird nicht > 255 sein oder eben 122? oder wie ist das genau.
ich bräuchte vllt. ein konkretes Beispiel..
 
K

kneitzel

Gast
Also ein int hat eine Größe von 4 Byte. Hexadezimal wäre ein int z.B. 0x04030201.

Ein byte hat nur die Größe von einem Byte - wie sollte es auch sonst sein :)

Wenn ich nun einen int wert in ein byte caste, werden alle Bytes bis auf das erste "weggeschmissen".

Also (byte)0x04030201 ist 0x01 - die anderen 3 Bytes (0x04, 0x03 und 0x02) gehen verloren.

Nun kann ich aber auch eine Bitweise Verschiebung durchführen über den >> bzw >>> Operator (Je nachdem, ob das Vorzeichen beachtet werden soll. Da wir die Bytes komplett verschieben wollen ohne auf ein Vorzeichen zu achten, nehmen wir >>>).

0x04030201 >>> 8 besagt, dass 8 Bits nach rechts verschoben werden sollen. Ein Byte hat 8 Bit, daher passt das ganz gut.

0x04030201 >>> 8 = 0x00040302
Wenn ich nun wieder zu byte caste, bekomme ich 0x02.

0x04030201 >>> 16 = 0x00000403 - cast zu byte: 0x03
0x04030201 >>> 24 = 0x00000004 - cast zu byte: 0x04

Somit kann man an alle 4 bytes eines Integers heran kommen. Und so könnte man z.B. aus einem Integer ein byte[] machen. Man hat aber dann 3 casts bei denen Daten verloren gehen und 3 Operationen, bei denen ebenfalls Daten verloren gehen.

Das ist das, was ich meinte.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Programmfehler Java Basics - Anfänger-Themen 8
X Programmfehler... Java Basics - Anfänger-Themen 17
J Programmfehler - Anfänger Java Basics - Anfänger-Themen 12
T Array verkleinern Java Basics - Anfänger-Themen 2
J Array aus Numberfield Eingaben Java Basics - Anfänger-Themen 7
D Array List mit Objekten sortieren Java Basics - Anfänger-Themen 2
onlyxlia Anzahl Random Zahlen mit Scanner abfragen und in Array speichern Java Basics - Anfänger-Themen 10
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
Ü Zweidimensionales Array in der ersten Zeile deklarieren Java Basics - Anfänger-Themen 13
Thomas Uppe 2D Array Reihenfolge vermischen Java Basics - Anfänger-Themen 4
T array auslesen Java Basics - Anfänger-Themen 2
Nitrogames Variablen Variable aus JOptionPane Abfrage in Array einfügen Java Basics - Anfänger-Themen 4
moini Auf Array aus Superklasse zugreifen? Java Basics - Anfänger-Themen 2
J ArrayList in 2D-Array konvertieren. Java Basics - Anfänger-Themen 48
M NullPointerException: Cannot read the array length because "this.Kinder" is null Java Basics - Anfänger-Themen 1
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
Finn_lol Fehlermeldung bei Schleife mit Array Java Basics - Anfänger-Themen 4
Proxy Chars vor array übergabe toLowerUpcase Java Basics - Anfänger-Themen 14
iAmFaiinez Primzahlen Tester ohne Array Java Basics - Anfänger-Themen 4
S array 2 dimensional treppe Java Basics - Anfänger-Themen 3
S Array 2x2 Blöcke mit 0 und 1 Java Basics - Anfänger-Themen 10
C Array von Klassen Java Basics - Anfänger-Themen 2
julian0507 2Dim-Array Spaltensummen Java Basics - Anfänger-Themen 1
XWing Doppelte Zahlen im Array Java Basics - Anfänger-Themen 8
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
Proxy Stack erweitern mit neuem Array falls der alte voll ist!? Java Basics - Anfänger-Themen 5
E Array, nächste Zahl zur 5 ausgeben, wie? Java Basics - Anfänger-Themen 42
J Array.list vergleichen Java Basics - Anfänger-Themen 1
W Java-Code mit Array Java Basics - Anfänger-Themen 14
D Reflections & Generisches Array Java Basics - Anfänger-Themen 4
T Array Java Basics - Anfänger-Themen 2
T Array Java Basics - Anfänger-Themen 15
T Wörteranzahl im Array zählen Java Basics - Anfänger-Themen 9
Ostkreuz Zweidimensionaler Array Index Java Basics - Anfänger-Themen 2
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
R Images aus einem Array ausgeben Java Basics - Anfänger-Themen 3
R 2d Array individuell machen Java Basics - Anfänger-Themen 4
D 2D Char Array into String Java Basics - Anfänger-Themen 2
J Array Median bestimmen Java Basics - Anfänger-Themen 6
S Array Maximum bestimmen mit for und foreach Java Basics - Anfänger-Themen 7
S Prüfen ob ein zweidimensionales Array rechteckig ist Java Basics - Anfänger-Themen 4
N Array Java Basics - Anfänger-Themen 1
J Array Mittleren Wert bestimmen Java Basics - Anfänger-Themen 2
D OOP Array einem Objekt zuweisen Java Basics - Anfänger-Themen 2
O Zahlen aus einem char-array per char + Zeichen addieren Java Basics - Anfänger-Themen 2
S leeres Array statt Null Pointer Exception ausgeben Java Basics - Anfänger-Themen 20
S Inhalte aus Array vergleichen und Max ausgeben Java Basics - Anfänger-Themen 3
M 2d array ohne längen anlegen Java Basics - Anfänger-Themen 4
S Bestimmte werte aus einem Array löschen Java Basics - Anfänger-Themen 2
S Ausgeben wie oft ein Wert in einem Array vorkommt Java Basics - Anfänger-Themen 7
E Reihenfolge der Werte umdrehen (mittels statischem int-Array Java Basics - Anfänger-Themen 3
O 2 Dimensionales Array Java Basics - Anfänger-Themen 6
M Bubble Sort - Int[] Array sortieren Java Basics - Anfänger-Themen 2
javaBoon86 Array mehrere Dimensionen Java Basics - Anfänger-Themen 10
B Array nach Elementwerten sortieren? Java Basics - Anfänger-Themen 1
B Explizit Array definieren geht nicht? Java Basics - Anfänger-Themen 14
D Kleinste Zahl in Array finden die vorher noch errechnet werden müssen. Java Basics - Anfänger-Themen 4
L Gegebenes Array sortieren, indem zufällige Zahlenpaare aus Array ausgewählt werden Java Basics - Anfänger-Themen 14
Say 2-DIM Array Code lesen und verstehen Java Basics - Anfänger-Themen 5
N Array beim erstellen mit Werten füllen Java Basics - Anfänger-Themen 6
C Java Array Struktur, welche ist wann besser? Java Basics - Anfänger-Themen 12
Temsky34 Array IndexOf nicht verfügbar Java Basics - Anfänger-Themen 18
belana wie am besten 2D Array von String to Integer Java Basics - Anfänger-Themen 18
S Array mit Methode löschen Java Basics - Anfänger-Themen 2
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
E Durch Muster in Array iterieren Java Basics - Anfänger-Themen 3
L Frage zum Array Java Basics - Anfänger-Themen 1
C 2D Array Ausgabe mit for-Schleife i,j Java Basics - Anfänger-Themen 4
D Methode: Array Reihenfolge tauschen Java Basics - Anfänger-Themen 3
julian0507 Array aus Methode in anderer Methode sichtbar machen Java Basics - Anfänger-Themen 10
P Array vom Typ Klasse Java Basics - Anfänger-Themen 18
Lion.King Array deklarieren und initialisieren Java Basics - Anfänger-Themen 5
P Array-Objekte-Aufruf Java Basics - Anfänger-Themen 22
A CSv.Datei einlesen und die werte in zweidemosional Int Array speichern Java Basics - Anfänger-Themen 9
M Methoden Zweidimensionaler Array mit Setter Methode ändern Java Basics - Anfänger-Themen 4
AkiJou Zeile in 2d Array löschen Java Basics - Anfänger-Themen 2
LilliCherry Array in einer Zeile ausgeben Java Basics - Anfänger-Themen 6
A Elemente in einem Array Java Basics - Anfänger-Themen 5
A Vorkommende Farben ermittel und als Array zurückgeben Java Basics - Anfänger-Themen 7
AhmadSlack Array Java Basics - Anfänger-Themen 7
Jambolo Kartenhand Array Java Basics - Anfänger-Themen 14
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
S Eine Variable in einem Array speichern Java Basics - Anfänger-Themen 5
T Methode, die prüft ob in einem Int-Array maximal 2 Zahlen enthalten sind, die größer als ihr Vorgänger sind Java Basics - Anfänger-Themen 5
T String Array Fehler beim Index Java Basics - Anfänger-Themen 3
krgewb byte-Array, das ein Bild repräsentiert Java Basics - Anfänger-Themen 1
1 Array rekursiv durchlaufen Java Basics - Anfänger-Themen 8
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
EykS 3D Druckdatei basierend auf 3D Array? Java Basics - Anfänger-Themen 3
sserio Array funktioniert nicht Java Basics - Anfänger-Themen 2
sserio Iterierung über ein zweidimensionales Array Java Basics - Anfänger-Themen 16
sserio Zweidimensionales Array [][] wird untereinander ausgegeben Java Basics - Anfänger-Themen 14
Chris.089 2 Werte im Array tauschen Java Basics - Anfänger-Themen 6
D EinMalEins mithilfe einer for-Schleife und Array Java Basics - Anfänger-Themen 1
L Unbekanntes Problem mit 2d Array Java Basics - Anfänger-Themen 6
L Gridmuster in einem Array Java Basics - Anfänger-Themen 2
sgtcoopa Array übergeben Schleife Java Basics - Anfänger-Themen 0
B Compiler-Fehler Array aus Objekten übergeben Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben