มีคำตอบที่ดีอยู่ที่นี่ แต่ฉันไม่เห็นการสาธิตการใช้งานระดับบิต เช่นเดียวกับ Visser (คำตอบที่ยอมรับในปัจจุบัน) พูดว่า Java ลงนามจำนวนเต็มตามค่าเริ่มต้น (Java 8 มีจำนวนเต็มไม่ได้ลงนาม แต่ฉันไม่เคยใช้เลย) โดยไม่ต้องกังวลใจต่อไปทำมัน ...
ตัวอย่าง RFC 868
จะเกิดอะไรขึ้นถ้าคุณต้องการเขียนจำนวนเต็มที่ไม่ได้ลงชื่อไปยัง IO ตัวอย่างการปฏิบัติคือเมื่อคุณต้องการส่งออกเวลาตามRFC 868868 สิ่งนี้ต้องการจำนวนเต็ม 32 บิต, big-endian และ unsigned ที่เข้ารหัสจำนวนวินาทีตั้งแต่ 12:00 AM 1 มกราคม 1900 คุณจะเข้ารหัสได้อย่างไร
สร้างจำนวนเต็ม 32- บิตที่ไม่ได้ลงชื่อของคุณเองดังนี้:
ประกาศอาร์เรย์ไบต์ 4 ไบต์ (32 บิต)
Byte my32BitUnsignedInteger[] = new Byte[4] // represents the time (s)
สิ่งนี้จะเริ่มต้นอาร์เรย์ให้ดูที่อาร์เรย์อาร์เรย์ถูกกำหนดค่าเริ่มต้นเป็นศูนย์ใน Java หรือไม่ . ตอนนี้คุณต้องกรอกข้อมูลในแต่ละไบต์ด้วยอาเรย์ตามลำดับใหญ่ (หรือเล็ก ๆ น้อย ๆ ถ้าคุณต้องการทำลายล้าง) สมมติว่าคุณมีเวลานาน (จำนวนเต็มยาวคือ 64 บิตใน Java) ที่เรียกว่าsecondsSince1900
(ซึ่งใช้ประโยชน์เพียง 32 บิตแรกเท่านั้นและคุณได้จัดการกับความจริงที่ว่าวันที่อ้างอิงเวลา 12.00 น. วันที่ 1 มกราคม 1970) คุณสามารถใช้ตรรกะ AND เพื่อแยกบิตออกจากนั้นและเปลี่ยนบิตเหล่านั้นไปยังตำแหน่ง (หลัก) ที่จะไม่ถูกละเว้นเมื่อรวมเข้ากับไบต์และในลำดับใหญ่
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
ตอนนี้เทียบเท่ากับจำนวนเต็ม 32 บิตที่ไม่ได้ลงนามซึ่งเป็นไปตามมาตรฐาน RCF 868 ใช่ประเภทข้อมูลแบบยาวมีการเซ็นชื่อ แต่เราไม่สนใจความจริงนั้นเพราะเราสันนิษฐานว่าวินาทีวินาทีตั้งแต่ 1900 ใช้เพียง 32 บิตที่ต่ำกว่าเท่านั้น เนื่องจาก coersing ยาวเป็นไบต์บิตทั้งหมดที่สูงกว่า 2 ^ 7 (สองหลักแรกในฐานสิบหก) จะถูกละเว้น
แหล่งอ้างอิง: Java Network Programming, 4th Edition