Ausgabe Java-Code?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

erst mal die 1. Zeile. Man nimmt von den Char a den Ascii Code:

public class MyClass {
    public static void main(String args[]) {
      int a=(int) 'a';
      System.out.println(a);
    }
}

Ausgabe hier: 97

also uc_a = 97

2.Zeile:

was macht 97 << 0x03; ?

Hier muss man etwas ausholen: << bedeutet "binary shift to left"

Wenn man eine Zahl nimmt, z.B. 3 . Das in Binär ist 11. also 3<<2 bedeutet, dass das binäre "11" um 2 Positionen nach links verschoben wird, also 1100. 1100 in dezimal ist 12. oder 3<<2 = 12.

Also zurück zu der Aufgabe. 97 in Binär ist 1100001

hexadezimal 0x03 ist 3. also wir müssen bei 97 << 0x03 : 1100001 um 3 bits nach links shiften. es kommt raus 1100001000 . das in binär ist 776. der code dazu:

public class MyClass {
    public static void main(String args[]) {
      int a= 97 << 0x03;
    
      System.out.println(a);
    }
}

Ausgabe: 776

3.Zeile:

was macht ~?

das heißt Bitwise complement.

Matematisch wird es so aussehen: n ist die Zahl. also ~n = -(n+1)

oder in unserem Bespiel mit 776 wird es dann -777

public class MyClass {
    public static void main(String args[]) {
      int a= 776;
    
      System.out.println(~a);
    }
}

Ausgabe -777

Geheimtipp: man kann sowas einfach ausprobieren, dann kommt man der Sache schon näher. Mit dem Debugger oder einfach mit der jshell, die in jedem JDK dabei ist.

jshell> int uc_a = 'a';
uc_a ==> 97

Das sollte nicht schwierig sein: der ASCII-Code von 'a' ist 0x61 oder dezimal 97. Der Typecast (int) ist dabei übrigens unnötig, er erfolgt automatisch.

jshell> int s = uc_a << 0x03;
s ==> 776

Das ist eine Spur weniger offensichtlich, aber auch nicht schwer zu verstehen. Wir schieben die Bits der Zahl 97 um 3 Positionen nach links (d.h. Richtung MSB). Mit jeder Verschiebung wird der Wert verdoppelt. Warum, ist hoffentlich klar: wenn du dasselbe mit Dezimalzahlen machst, wäre jede Stelle Faktor 10. Bei Binärzahlen ist es Faktor 2.

jshell> ~s
$5 ==> -777

Was passiert hier? Wir invertieren die Bits von 776 (das sogenannte Einerkomplement). Ein int ist aber eine vorzeichenbehaftete Zahl, und um Zahlen mit Vorzeichen binär zu speichern, wird üblicherweise das Zweierkomplement verwendet. Wie bildet man das Zweierkomplement: invertieren (= Einserkomplement) und 1 dazu. Und so erklärt sich, warum die invertierten Bits von 776 als -777 interpretiert werden.

Das war's. Wenn du noch Probleme hast, schau es dir in Binärdarstellung an.

Hmm… es ist das einerkomplement von 183*8