Có câu trả lời tốt ở đây, nhưng tôi không thấy bất kỳ cuộc biểu tình nào về hoạt động bitwise. Giống như Visser (câu trả lời hiện được chấp nhận) cho biết, Java ký các số nguyên theo mặc định (Java 8 có các số nguyên không dấu, nhưng tôi chưa bao giờ sử dụng chúng). Nếu không có thêm rắc rối, hãy làm điều đó ...
Ví dụ RFC 868
Điều gì xảy ra nếu bạn cần viết một số nguyên không dấu vào IO? Ví dụ thực tế là khi bạn muốn xuất thời gian theo RFC 868 . Điều này đòi hỏi một số nguyên 32 bit, endian lớn, không dấu, mã hóa số giây kể từ 12:00 AM ngày 1 tháng 1 năm 1900. Bạn sẽ mã hóa số này như thế nào?
Tạo số nguyên 32 bit không dấu của riêng bạn như thế này:
Khai báo một mảng 4 byte (32 bit)
Byte my32BitUnsignedInteger[] = new Byte[4] // represents the time (s)
Điều này khởi tạo mảng, xem Các mảng byte có được khởi tạo về 0 trong Java không? . Bây giờ bạn phải điền từng byte trong mảng với thông tin theo thứ tự lớn (hoặc endian nhỏ nếu bạn muốn phá hủy sự tàn phá). Giả sử bạn có thời gian chứa thời gian dài (số nguyên dài dài 64 bit trong Java) được gọi secondsSince1900
(Chỉ sử dụng giá trị 32 bit đầu tiên và bạn đã xử lý thực tế là Ngày tham chiếu 12:00 AM ngày 1 tháng 1 năm 1970), sau đó bạn có thể sử dụng logic AND để trích xuất các bit từ nó và chuyển các bit đó thành các vị trí (chữ số) sẽ không bị bỏ qua khi được đặt vào Byte và theo thứ tự lớn.
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
my32BitUnsignedInteger
Bây giờ của chúng tôi tương đương với một số nguyên lớn 32 bit không dấu, tuân thủ tiêu chuẩn RCF 868. Có, kiểu dữ liệu dài đã được ký, nhưng chúng tôi đã bỏ qua thực tế đó, vì chúng tôi giả sử rằng giâySince1900 chỉ sử dụng 32 bit thấp hơn). Do kết hợp độ dài thành một byte, tất cả các bit cao hơn 2 ^ 7 (hai chữ số đầu tiên trong hex) sẽ bị bỏ qua.
Nguồn tham khảo: Lập trình mạng Java, Phiên bản thứ 4.