JavaRush /Java-Blog /Random-DE /Java: Bits und Bytes
Viacheslav
Level 3

Java: Bits und Bytes

Veröffentlicht in der Gruppe Random-DE
Java: Bits und Bytes - 1

Einführung

Zählen Menschen im dezimalen Zahlensystem, zählen Computer im binären Zahlensystem. Und ein Programmierer muss verstehen, wie man sowohl mit Menschen als auch mit Computern spricht. Diese Rezension soll in dieser Angelegenheit hilfreich sein. Manchmal verbirgt sich hinter dem Offensichtlichen eine ganze Welt. Ich schlage vor, über diese Welt zu sprechen. Beispielsweise hat eine Woche 7 Tage. Beantworten wir nun die Frage: Was ist die Zahl „7“? ) Erstens ist es eine ganzzahlige (positive) natürliche Zahl. Es ist auch eine Dezimalzahl. Eine Dezimalzahl ist eine Zahl im Dezimalsystem. Wenn wir „dezimales Zahlensystem“ sagen, bedeutet dies, dass das Zahlensystem eine Basis von 10 hat . Die Basis gibt an, wie viele Ziffern in einem bestimmten Zahlensystem zur Darstellung einer Zahl verwendet werden können. Der Countdown beginnt bei Null. Um Zahlen im dezimalen Zahlensystem darzustellen, verwenden wir dementsprechend Zahlen von 0 bis 9. Das ist gut, aber wir müssen nicht nur bis 9 zählen, sondern auch darüber hinaus. Wie sein? Zum Beispiel die Zahl 10. Um diese Zahl zu schreiben, verwenden wir bis zu 2 Ziffern. Die Position jeder Ziffer im Dezimalsystem wird als Dezimalstelle bezeichnet. Die Ziffern werden von rechts nach links gezählt:
Java: Bits und Bytes - 2
Darüber hinaus kann die Dezimalzahl wie folgt erweitert werden: 103 = 1*10^2 + 0*10^1 + 3*10^0
Java: Bits und Bytes - 3
Die Zahl wächst im Wesentlichen von rechts nach links. Das heißt, zuerst war es 7 und dann wurde daraus 10. Daher werden die Ziffern von rechts beginnend bei Null gezählt. Wozu dient das alles? Das liegt daran, dass wir keine Computer sind. Und während wir dezimal (also zur Basis 10) zählen, zählen Computer binär (also zur Basis 2). Die Regeln, die in diesen Zahlensystemen gelten, sind jedoch dieselben.
Java: Bits und Bytes - 4

Binäres System

Das Binärsystem ist dem Dezimalsystem sehr ähnlich, mit dem einzigen Unterschied, dass die Grenze hier nicht bei 10, sondern bei 2 liegt. Vergleichen wir mit einem Beispiel. Wie stellen wir 11 binär dar? Es ist ganz einfach: Sie müssen nur die Dezimalzahl durch die Basis 2 dividieren, also 11/2 in einer Spalte zählen. Beispiel:
Java: Bits und Bytes - 5
Oder hier ist ein Beispiel von WikiHow:
Java: Bits und Bytes - 6
Interessanterweise können wir eine Zahl im Binärformat auf die gleiche Weise wie im Dezimalformat darstellen: 111 im Binärformat = 1*2^2 + 1*2^1 + 1*2^0 = 4 + 2 + 1
Java: Bits und Bytes - 7
Ein Beispiel für die Umrechnung von Binär- in Dezimalzahl finden Sie im Online-Rechner . Wenn wir über die Tatsache sprechen, dass die Betriebsregeln in Zahlensystemen dieselben sind, schauen wir uns die Addition im Binärsystem an:
Java: Bits und Bytes - 8
Wie Sie sehen, übertragen wir die Ziffern bei der Addition auf die gleiche Weise wie im Dezimalsystem. Die Additionsanalyse kann beispielsweise hier eingesehen werden: Übrigens wird regelmäßig das Wort „Entladung“ erwähnt. Und was ist das? Der Ort ist lediglich ein „strukturelles Element“ zur Darstellung einer Zahl. Das heißt, die Zahl 10 besteht aus zwei Ziffern: Wir benötigen 2 Ziffern, 2 Stellen, 2 Elemente, um diese Zahl zu schreiben. Für uns ist es wichtig, dies zu verstehen, denn im binären Zahlensystem ist eine Ziffer ein Bit . Das Wort Bit kommt vom englischen „binary digit“ , also einer Binärzahl. Es kann entweder 0 oder 1 sein. Aber genauso wie wir Zahlen und Wörter als Ganzes lesen und nicht Buchstabe für Buchstabe, lesen Computer nicht ein Bit nach dem anderen. Für das minimale „Stück“ verarbeiteter Informationen im RAM (die sogenannte kleinste adressierbare Informationseinheit) wird eine Folge von 8 Bits gelesen . Da es 8 davon gibt, wird dieses als „Oktett“ bezeichnet. Und auch – das bekanntere Wort Byte . Um sich an das Oktett zu erinnern, können Sie sich daran erinnern, dass das Wort Octopus (acht Beine) ins Englische als Oktopus übersetzt wird. Das heißt, hier steht genau das gleiche „Okto“ im Titel:
Java: Bits und Bytes - 9
Lassen Sie uns darüber nachdenken, wie viele Bits wir maximal als 8 Bits darstellen können.
Java: Bits und Bytes – 10
Und hier stellt sich die Frage: Was ist mit negativen Zahlen? Um dies zu verstehen, sprechen wir darüber, wie Bytes in Java dargestellt werden
Java: Bits und Bytes - 11

Java und Byte

Wie kommt es, dass wir in Java negative Zahlen verwenden können? Es ist einfach gemacht. In Java werden Bytes signiert. Die Ziffer/das Bit ganz links (auch „höchstwertiges Bit“ genannt) wird zu einer Art „Marker“ gemacht, der die Frage beantwortet: „Ist diese Zahl negativ?“ Wenn die Antwort „Ja“ lautet, hat der Marker den Wert 1. Andernfalls ist er 0. Schauen wir uns ein Beispiel an, wie man die Zahl 5 in eine negative Zahl 5 umwandelt:
Java: Bits und Bytes – 12
Anhand dieses Bildes können Sie die Grenzen verstehen, innerhalb derer ein Byte-Wert liegt:
Java: Bits und Bytes - 13
Es ist auch klar, dass:
  • Wenn wir eins zu 127 addieren, erhalten wir -128.
  • Wenn wir eins von -128 subtrahieren, erhalten wir 127.
Daher kann Byte in Java einen Wert von -128 bis 127 annehmen. Wie wir uns erinnern, ist ein Byte ein Oktett. Und die maximale Ziffer/das höchstwertige Bit hat die fortlaufende Nummer 7, da wir von Null an zählen. In diesem Fall kann man sich leicht merken, dass ein Byte gleich -2 hoch 7 (untere Grenze) bis 2 hoch 7 minus 1 (obere Grenze) ist. Die Arbeit mit dem Datentyp selbst ist einfach. Wir verwenden für diesen Artikel den Online-Java-Compiler „repl.it“ als „Sandbox“. https://repl.it/linguals/java. Lassen Sie uns beispielsweise den Code ausführen, der eine Byte-Variable in Binärform als Zeichenfolge darstellt:
class Main {
  public static void main(String[] args) {
    byte octet = 5;
    String bin = String.format("%8s", Integer.toBinaryString(octet)).replace(' ', '0');
    System.out.println(bin);
  }
}
Bei der Arbeit mit I/O-Streams wird aktiv mit Bytes gearbeitet. Mehr können Sie im Tutorial von Oracle lesen: „ I/O Streams “. Darüber hinaus können Sie in Java ein spezielles Literal verwenden, um den Wert als Bits anzugeben:
class Main {
  public static void main(String[] args) {
    byte data = 0b101;
    System.out.println(data);
  }
}
Java: Bits und Bytes - 14

Bit-Manipulation

Wenn man auf Bytes und Bits eingeht, kann man nicht umhin, verschiedene Bitmanipulationen zu erwähnen. Die wahrscheinlich häufigste Operation sind Verschiebungen (bitweise Verschiebung oder Bit-Verschiebung). Und das alles, weil ihr Ergebnis klare praktische Vorteile hat. Was ist der Nutzen? Das Verschieben um N Positionen nach links entspricht der Multiplikation der Zahl mit 2N. Und eine Verschiebung nach rechts ähnelt der gleichen Division. Also 5<<2 == 5*Math.pow(2,2) Und um zu verstehen, warum das so ist, schauen wir uns dieses Beispiel genauer an:
Java: Bits und Bytes - 15
Die bitweise Negation NOT (Unary bitwise), die durch eine Tilde dargestellt wird, invertiert die Bits. Es wird als Tilde geschrieben, zum Beispiel ~5.
public static void main(String[] args) {
	System.out.println(~5); //-6
 	System.out.println(~-5);//4
}
Dies zeigt einmal mehr, dass wir, wenn Java das Vorzeichen einer Zahl ändert, zusätzlich zur Invertierung der Bitwerte ganz am Ende +1 ausführen. Und ohne dies ändert sich, wie wir sehen, unsere Nummer 5. Und damit die Zahl dieselbe bleibt wie vor dem Vorzeichenwechsel, müssen Sie +1 machen. Mit bitweisem UND können Sie zwei verschiedene Zahlen nur dann für ein Bit mit dem Wert 1 belassen, wenn alle Bits den Wert Eins haben. Das Interessante daran könnte sein, dass es einige Anwendungsvorteile bietet:
int x=4;
System.out.println((x&1) != 1);
Dieser Code prüft die Zahl x auf Parität. Schauen wir uns ein Beispiel an:
Java: Bits und Bytes - 16
Durch die gemeinsame Verwendung von Bitwise AND und Bitwise OR können Sie Masken verwenden:
public static void main(String[] args) {
    byte optionA=0b0100;
    byte optionB=0b0010;
    byte optionC=0b0001;
    byte value = (byte)(optionB | optionC);
    // Check for optionB
    if ((optionC & value) != 0b0000) {
      System.out.println("Yes");
    } else {
      System.out.println("No");
    }
  }
Weitere Einzelheiten finden Sie unter „ Maskierungsoptionen mit bitweisen Operatoren in Java “ . Bitmanipulation ist ein interessantes Thema, zu dem separate Rezensionen, Artikel und Bücher geschrieben wurden. Und von hier aus beginnt der lange Weg zur Kryptographie. Im Rahmen dieser Überprüfung lohnt es sich zu verstehen, warum und wie es funktioniert. Für weitere Informationen zu Bitoperationen empfehle ich die Lektüre der Rezension von tproger: „ Über Bitoperationen “.

Primitive Typen

Ein Byte ist also ein Oktett, also 8 Bits. Man kann sich leicht merken, dass es in Java zufällig auch 8 primitive Typen gibt. Ein primitiver Typ ist ein Datentyp, der in eine Programmiersprache integriert ist, also standardmäßig verfügbar ist. Byte ist im Hinblick auf den Speicherbedarf der kleinste primitive Datentyp, mit dem Java arbeiten kann. Wie bereits erwähnt, belegt ein Byte 8 Bit. Daher ist die höchstwertige Ziffer die Zahl 7. Daher enthält das Byte die Werte von -2 bis 7. Potenz bis 2 bis 7. Potenz minus 1 des Ergebnisses. Welche anderen primitiven Typen gibt es:
Java: Bits und Bytes - 17
Wie wir aus der Tabelle ersehen können, verdoppelt sich der Datentyp im Hinblick auf die belegte Datenmenge. Das heißt, short = 2 * Byte und int = 2 * short. Es ist eigentlich leicht zu merken. Denken Sie daran, dass Byte = 8 Bits. Auch die Tatsache, dass es nicht weniger sein kann, wird in Erinnerung gerufen. Im Englischen wird eine ganze Zahl als Ganzzahl bezeichnet. Der daraus resultierende primitive Typ wurde mit der Abkürzung int bezeichnet. Es gibt eine reguläre ganze Zahl – int. Es gibt eine kurze Version, kurz, und eine lange Version, lang. Dementsprechend belegt int 32 Bit (4 Bytes). Die kurze Version ist 2-mal kleiner – 16 Bit (2 Bytes), und die lange Version ist doppelt so groß, d. h. 64 Bit (8 Byte). Ein Int kann also höchstens eine Zahl von etwa 2 Milliarden und einhundert Millionen speichern. Und Long kann maximal etwa 9 Billiarden speichern (ein schönes Wort). Wenn wir uns an den alten Witz erinnern, dass ein unerfahrener Programmierer denkt, dass ein Kilobyte 1000 Bytes hat, und ein erfahrener Programmierer glaubt, dass ein Kilogramm 1024 Gramm hat, können wir verstehen:
1 mb = 1024 Kbyte = 1024 * 1024 = 1048576 bytes
1 int = 4 bytes
1 mb = 262144 int
Einem aufmerksamen Leser dürfte übrigens aufgefallen sein, dass auf dem Bild nur 7 Typen zu sehen sind. 8 Der primitive Typ ist boolesch. boolean ist ein boolescher Datentyp, der nur zwei Werte hat: true und false. Aber es stellt sich die Frage: Welche Größe hat es? Die Java Virtual Machine-Spezifikation und der Abschnitt „ 2.3.4. Der boolesche Typ “ werden uns antworten:
Java: Bits und Bytes - 18
Das heißt, nur ein boolescher Wert nimmt den gleichen Betrag an wie ein int. Wenn wir ein Array mit booleschen Werten deklarieren, belegt jedes Element des Arrays 1 Byte. Das sind solche Wunder :)

Abschluss

Ich schlage vor, dass Sie sich zur Festigung mit ein paar weiteren Materialien vertraut machen: #Wjatscheslaw
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION