Ada jawaban yang bagus di sini, tapi saya tidak melihat demonstrasi operasi bitwise. Seperti Visser (jawaban yang saat ini diterima) mengatakan, Java menandatangani bilangan bulat secara default (Java 8 memiliki bilangan bulat yang tidak ditandatangani, tetapi saya tidak pernah menggunakannya). Tanpa basa-basi lagi, mari kita lakukan ...
Contoh RFC 868
Apa yang terjadi jika Anda perlu menulis bilangan bulat yang tidak ditandatangani ke IO? Contoh praktisnya adalah ketika Anda ingin menampilkan waktu sesuai dengan RFC 868 . Ini membutuhkan bilangan bulat 32-bit, big-endian, tidak ditandatangani yang mengkodekan jumlah detik sejak pukul 12:00 AM 1 Januari 1900. Bagaimana Anda menyandikan ini?
Buat integer 32-bit Anda yang tidak ditandatangani seperti ini:
Deklarasikan array byte 4 byte (32 bit)
Byte my32BitUnsignedInteger[] = new Byte[4] // represents the time (s)
Ini menginisialisasi array, lihat Apakah array byte diinisialisasi ke nol di Jawa?. Sekarang Anda harus mengisi setiap byte dalam array dengan informasi dalam urutan big-endian (atau little-endian jika Anda ingin menghancurkan kekacauan). Dengan asumsi Anda memiliki waktu yang lama (bilangan bulat panjang 64 bit di Jawa) disebut secondsSince1900
(Yang hanya menggunakan nilai 32 bit pertama, dan Anda telah menangani fakta bahwa Referensi tanggal 12:00 AM 1 Januari 1970), maka Anda dapat menggunakan logika DAN untuk mengekstrak bit dari itu dan menggeser bit-bit itu ke posisi (digit) yang tidak akan diabaikan ketika disatukan menjadi Byte, dan dalam urutan 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
Kami my32BitUnsignedInteger
sekarang setara dengan integer big-endian 32 bit yang tidak ditandatangani yang mematuhi standar RCF 868. Ya, datatype lama ditandatangani, tetapi kami mengabaikan fakta itu, karena kami menganggap bahwa secondsSince1900 hanya menggunakan 32 bit yang lebih rendah). Karena memasukkan panjang ke dalam byte, semua bit lebih tinggi dari 2 ^ 7 (dua digit pertama dalam hex) akan diabaikan.
Sumber yang dirujuk: Pemrograman Jaringan Java, Edisi ke-4.