Hier gibt es gute Antworten, aber ich sehe keine Demonstrationen von bitweisen Operationen. Wie Visser (die derzeit akzeptierte Antwort) sagt, hat Java standardmäßig ganze Zahlen mit Vorzeichen (Java 8 hat ganze Zahlen ohne Vorzeichen, aber ich habe sie nie benutzt). Ohne Umschweife, los geht's...
RFC 868 Beispiel
Was passiert, wenn Sie eine ganze Zahl ohne Vorzeichen in IO schreiben müssen? Ein praktisches Beispiel ist, wenn Sie die Zeit gemäß RFC 868 . Dies erfordert eine vorzeichenlose 32-Bit-Ganzzahl (Big-Endian), die die Anzahl der Sekunden seit dem 1. Januar 1900 um 12:00 Uhr kodiert. Wie würden Sie dies kodieren?
Erstellen Sie Ihre eigene 32-Bit-Ganzzahl ohne Vorzeichen wie folgt:
Deklarieren Sie ein Byte-Array von 4 Bytes (32 Bits)
Byte my32BitUnsignedInteger[] = new Byte[4] // represents the time (s)
Dadurch wird das Array initialisiert, siehe Werden Byte-Arrays in Java mit 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 wollen). Angenommen, Sie haben einen Long-Wert, der die Zeit enthält (Long-Integer sind in Java 64 Bit lang) und der secondsSince1900
(Die nur die ersten 32 Bits wert, und Sie haben die Tatsache, dass Datum 12:00 A.M. 1. Januar 1970 verweist behandelt), dann können Sie die logische UND verwenden, um Bits aus ihm zu extrahieren und verschieben Sie diese Bits in Positionen (Ziffern), die nicht ignoriert werden, wenn in ein Byte coersed, und in Big-Endian-Reihenfolge.
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
Unser my32BitUnsignedInteger
entspricht nun einer vorzeichenlosen 32-Bit-Big-Endian-Ganzzahl, die dem RCF 868-Standard entspricht. Ja, der Datentyp long ist vorzeichenbehaftet, aber wir haben diese Tatsache ignoriert, weil wir davon ausgingen, dass secondsSince1900 nur die unteren 32 Bits verwendet). Da der Long in ein Byte umgewandelt wird, werden alle Bits höher als 2^7 (die ersten beiden Ziffern in Hexadezimal) ignoriert.
Referenzierte Quelle: Java Network Programming, 4. Auflage.