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.