Il y a de bonnes réponses ici, mais je ne vois aucune démonstration d'opérations au niveau du bit. Comme Visser (la réponse actuellement acceptée) le dit, Java signe des entiers par défaut (Java 8 a des entiers non signés, mais je ne les ai jamais utilisés). Sans plus tarder, faisons-le ...
Exemple RFC 868
Que se passe-t-il si vous devez écrire un entier non signé dans IO? Un exemple pratique est lorsque vous souhaitez sortir l'heure conformément à la RFC 868 . Cela nécessite un entier non signé 32 bits, big-endian, qui code le nombre de secondes depuis le 1er janvier 1900 à 00h00. Comment encoderiez-vous cela?
Créez votre propre entier 32 bits non signé comme ceci:
Déclarez un tableau d'octets de 4 octets (32 bits)
Byte my32BitUnsignedInteger[] = new Byte[4] // represents the time (s)
Cela initialise le tableau, voir Les tableaux d'octets sont - ils initialisés à zéro en Java? . Vous devez maintenant remplir chaque octet du tableau avec des informations dans l'ordre big-endian (ou little-endian si vous voulez faire des ravages). En supposant que vous ayez un long contenant l'heure (les entiers longs ont 64 bits de long en Java) appelé secondsSince1900
(qui n'utilise que les 32 premiers bits, et que vous avez géré le fait que la date fait référence à 00h00 le 1er janvier 1970), alors vous pouvez utiliser le ET logique pour en extraire des bits et les déplacer dans des positions (chiffres) qui ne seront pas ignorées lors de la compression dans un octet, et dans l'ordre 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
Notre my32BitUnsignedInteger
est maintenant équivalent à un entier non signé de 32 bits, big-endian, conforme à la norme RCF 868. Oui, le type de données long est signé, mais nous avons ignoré ce fait, car nous avons supposé que le secondsSince1900 n'utilisait que les 32 bits inférieurs). En raison de la conversion du long en octet, tous les bits supérieurs à 2 ^ 7 (les deux premiers chiffres en hexadécimal) seront ignorés.
Source référencée: Java Network Programming, 4th Edition.