Tutaj są dobre odpowiedzi, ale nie widzę żadnych demonstracji operacji bitowych. Jak mówi Visser (obecnie akceptowana odpowiedź), Java domyślnie podpisuje liczby całkowite (Java 8 ma liczby całkowite bez znaku, ale nigdy ich nie używałem). Bez zbędnych ceregieli, zróbmy to ...
Przykład RFC 868
Co się stanie, jeśli będziesz musiał zapisać liczbę całkowitą bez znaku w IO? Praktycznym przykładem jest, gdy chcesz wyprowadzić czas zgodnie z RFC 868 . Wymaga to 32-bitowej, dużej liczby całkowitej bez znaku, która koduje liczbę sekund od 00:00 1 stycznia 1900 roku. Jak byś to zakodował?
Stwórz własną 32-bitową liczbę całkowitą bez znaku:
Deklaracja tablicy bajtów 4 bajtów (32 bity)
Byte my32BitUnsignedInteger[] = new Byte[4] // represents the time (s)
To inicjuje tablicę, patrz Czy tablice bajtów są inicjowane na zero w Javie? . Teraz musisz wypełnić każdy bajt w tablicy informacjami w kolejności big-endian (lub little-endian, jeśli chcesz zniszczyć spustoszenie). Zakładając, że masz długi zawierający czas (długie liczby całkowite w Javie mają 64 bity) secondsSince1900
(który wykorzystuje tylko pierwsze 32 bity, a ty poradziłeś sobie z faktem, że data odnosi się do godziny 12:00 1 stycznia 1970), to możesz użyć logicznego AND do wydobycia z niego bitów i przesunięcia tych bitów na pozycje (cyfry), które nie zostaną zignorowane, gdy zostaną wprowadzone w Bajt, w kolejności big-endian.
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
Nasz my32BitUnsignedInteger
jest teraz równoważny z niepodpisaną 32-bitową liczbą całkowitą big-endian, która jest zgodna ze standardem RCF 868. Tak, długi typ danych jest podpisany, ale zignorowaliśmy ten fakt, ponieważ założyliśmy, że secondSince1900 używał tylko niższych 32 bitów). Z powodu przekształcenia długiego w bajt wszystkie bity większe niż 2 ^ 7 (pierwsze dwie cyfry w kodzie szesnastkowym) zostaną zignorowane.
Źródło odniesienia: Java Network Programming, 4th Edition.