Hier gibt es gute Antworten, aber ich sehe keine Demonstrationen von bitweisen Operationen. Wie Visser (die derzeit akzeptierte Antwort) sagt, signiert Java standardmäßig Ganzzahlen (Java 8 hat Ganzzahlen ohne Vorzeichen, aber ich habe sie nie verwendet). Lass es uns ohne weiteres tun ...
RFC 868 Beispiel
Was passiert, wenn Sie eine vorzeichenlose Ganzzahl in IO schreiben müssen? Ein praktisches Beispiel ist, wenn Sie die Zeit gemäß RFC 868 ausgeben möchten . Dies erfordert eine 32-Bit-Big-Endian-Ganzzahl ohne Vorzeichen, die die Anzahl der Sekunden seit dem 1. Januar 1900 um 00:00 Uhr codiert. Wie würden Sie dies codieren?
Erstellen Sie Ihre eigene vorzeichenlose 32-Bit-Ganzzahl wie folgt:
Deklarieren Sie ein Byte-Array mit 4 Bytes (32 Bit).
Byte my32BitUnsignedInteger[] = new Byte[4] // represents the time (s)
Dadurch wird das Array initialisiert, siehe Werden Byte-Arrays in Java auf Null initialisiert? . Jetzt müssen Sie jedes Byte im Array mit Informationen in der Big-Endian-Reihenfolge füllen (oder Little-Endian, wenn Sie Chaos anrichten möchten). Angenommen, Sie haben eine lange Zeit, die die Zeit enthält (lange Ganzzahlen sind in Java 64 Bit lang secondsSince1900
) Sie können das logische UND verwenden, um Bits daraus zu extrahieren und diese Bits in Positionen (Ziffern) zu verschieben, die beim Zusammenführen in ein Byte und in Big-Endian-Reihenfolge nicht ignoriert werden.
my32BitUnsignedInteger[0] = (byte) ((secondsSince1900 & 0x00000000FF000000L) >> 24); // first byte of array contains highest significant bits, then shift these extracted FF bits to first two positions in preparation for coersion to Byte (which only adopts the first 8 bits)
my32BitUnsignedInteger[1] = (byte) ((secondsSince1900 & 0x0000000000FF0000L) >> 16);
my32BitUnsignedInteger[2] = (byte) ((secondsSince1900 & 0x000000000000FF00L) >> 8);
my32BitUnsignedInteger[3] = (byte) ((secondsSince1900 & 0x00000000000000FFL); // no shift needed
Unsere my32BitUnsignedInteger
entspricht jetzt einer vorzeichenlosen 32-Bit-Big-Endian-Ganzzahl, die dem RCF 868-Standard entspricht. Ja, der lange Datentyp ist signiert, aber wir haben diese Tatsache ignoriert, da wir davon ausgegangen sind, dass der secondSince1900 nur die unteren 32 Bit verwendet hat. Da das Long in ein Byte umgewandelt wird, werden alle Bits, die höher als 2 ^ 7 sind (die ersten beiden Ziffern in Hex), ignoriert.
Quelle angegeben: Java Network Programming, 4. Ausgabe.