2013-04-04 48 views
6

Tôi có dòng mã nàyJava Bitwise hoạt động

int b1 = 0xffff & (content[12]<<8 | 0xff & content[11]); 

Tôi có một bytearray (nội dung []) trong little endian và cần phải tạo một giá trị 2 byte. Mã này thực hiện công việc tốt nhưng trước khi thử nghiệm tôi đã viết nó như thế này

int b1 = 0xffff & (content[12]<<8 | content[11]); 

và kết quả là không đúng. Câu hỏi của tôi là tại sao 0xff cần thiết trong kịch bản này?

+0

Vì byte được hiểu là số nguyên đã ký, và điều này có nghĩa là, (byte) 0x80 nhận được (int) 0xffffff80. Điều này được gọi là tiện ích ký tên. – Ingo

Trả lời

12

Các 0xff là cần thiết vì một hợp lưu của hai yếu tố:

  1. Tất cả các loại nguyên trong Java được ký
  2. Tất cả các nhà khai thác Bitwise thúc đẩy lập luận của họ để int (hoặc long, nếu cần thiết) trước khi hành động.

Kết quả là nếu bit thứ tự cao của content[11] được đặt, nó sẽ được gia hạn ký hiệu thành giá trị âm int. Bạn cần phải sau đó & điều này với 0xff để trả về giá trị byte (dương). Nếu không, khi bạn | kết quả là content[12]<<8, byte thứ tự cao sẽ là tất cả 1 giây.

+0

Thx để trả lời! Tôi sẽ không đoán nội dung [11] sẽ được đúc thành int với bộ bit đặt hàng cao. Tôi nghĩ khi tôi kết hợp hai giá trị với HOẶC chúng sẽ được sử dụng AS ARE ở mức bit. Chúc mừng – John

+1

@John Nếu bạn hài lòng với câu trả lời này (và bạn dường như là), hãy [chấp nhận nó] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer- công việc). –

Các vấn đề liên quan