Ci sono buone risposte qui, ma non vedo alcuna dimostrazione di operazioni bit per bit. Come dice Visser (la risposta attualmente accettata), Java firma gli interi di default (Java 8 ha numeri interi senza segno, ma non li ho mai usati). Senza ulteriori indugi, facciamolo ...
Esempio RFC 868
Cosa succede se è necessario scrivere un numero intero senza segno su IO? L'esempio pratico è quando si desidera emettere l'ora secondo RFC 868 . Ciò richiede un numero intero senza segno a 32 bit, big-endian, che codifica il numero di secondi a partire dalle 12:00 del 1 ° gennaio 1900. Come lo codificheresti?
Crea il tuo numero intero a 32 bit senza segno in questo modo:
Dichiarare un array di byte di 4 byte (32 bit)
Byte my32BitUnsignedInteger[] = new Byte[4] // represents the time (s)
Questo inizializza l'array, vedi Gli array di byte sono inizializzati su zero in Java? . Ora devi riempire ogni byte dell'array con le informazioni nell'ordine big-endian (o little-endian se vuoi rovinare il caos). Supponendo che tu abbia un lungo che contiene il tempo (i numeri interi lunghi sono lunghi 64 bit in Java) chiamato secondsSince1900
(che utilizza solo i primi 32 bit, e hai gestito il fatto che la data fa riferimento 12:00 AM 1 gennaio 1970), quindi puoi usare l'AND logico per estrarre bit da esso e spostare quei bit in posizioni (cifre) che non verranno ignorate quando vengono portate in un byte e in ordine 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
Nostro my32BitUnsignedInteger
è ora equivalente a un intero big-endian a 32 bit senza segno che aderisce allo standard RCF 868. Sì, il tipo di dati lungo è firmato, ma abbiamo ignorato questo fatto, poiché abbiamo assunto che i secondi, dal momento che solo il 1900 utilizzava solo i 32 bit inferiori). A causa del passaggio del long in un byte, tutti i bit superiori a 2 ^ 7 (prime due cifre in esadecimale) verranno ignorati.
Fonte di riferimento: Java Network Programming, 4th Edition.