2012-10-07 27 views
24

Tôi muốn lưu trữ hai int trong một thời gian dài (thay vì phải tạo một đối tượng Point mới mỗi lần).Java lưu trữ hai int trong một thời gian dài

Hiện tại, tôi đã thử cách này. Nó không làm việc, nhưng tôi không biết những gì là sai với nó:

// x and y are ints 
long l = x; 
l = (l << 32) | y; 

Và tôi nhận được các giá trị int như sau:

x = (int) l >> 32; 
y = (int) l & 0xffffffff; 

Trả lời

47

y là việc đăng ký mở rộng trong lần đầu tiên đoạn mã sẽ ghi đè x với -1 bất cứ khi nào y < 0.

Trong đoạn thứ hai, quá trình truyền tới int được thực hiện trước ca làm việc, vì vậy x thực sự nhận được giá trị y.

long l = (((long)x) << 32) | (y & 0xffffffffL); 
int x = (int)(l >> 32); 
int y = (int)l; 
+0

Ah, có ý nghĩa. Một câu hỏi tôi có là liệu nó có quan trọng nếu bạn bitmask bằng cách sử dụng 0xffffffffL dài hoặc int 0xffffffff. – LanguagesNamedAfterCofee

+1

@LanguagesNamedAfterCofee có vấn đề, nếu bạn mặt nạ với '0xffffffff' (không có L) thì nó chỉ là một int, vì vậy' & 'là một no-op và' y' * vẫn nhận được dấu mở rộng *. – harold

+0

Được rồi, cảm ơn lời giải thích! – LanguagesNamedAfterCofee

9

Dưới đây là một tùy chọn khác sử dụng dấu gạch ngang thay vì toán tử bitwise. Tốc độ-khôn ngoan, nó là chậm hơn, khoảng 1/5 tốc độ, nhưng nó là dễ dàng hơn nhiều để xem những gì đang xảy ra:

long l = ByteBuffer.allocate(8).putInt(x).putInt(y).getLong(0); 
// 
ByteBuffer buffer = ByteBuffer.allocate(8).putLong(l); 
x = buffer.getInt(0); 
y = buffer.getInt(1); 
Các vấn đề liên quan