2016-12-12 17 views
5

Làm thế nào để tôi viết sau mã trong một đơn giản cho vòng lặp:Làm thế nào để viết khối mã đính kèm trong một vòng lặp for

int asInt = (valueAsBytes[3] & 0xFF) 
       | ((valueAsBytes[2] & 0xFF) << 8) 
       | ((valueAsBytes[1] & 0xFF) << 16) 
       | ((valueAsBytes[0] & 0xFF) << 24); 
+1

Eran đưa ra một câu trả lời đúng, nhưng tôi cảm thấy muốn ném vào đó tôi nghĩ (ý kiến ​​cá nhân!) Nó sẽ được tối ưu hóa sớm. Mã đó có thể đọc được và nếu nó hoạt động, tôi không thấy lý do tại sao bạn muốn thay thế nó bằng một vòng lặp for. – Fildor

+1

Tôi chỉ muốn khái quát hóa –

Trả lời

5

Lưu ý rằng chỉ số mảng giảm bởi 1 trong mỗi truy cập vào valueAsBytes, trong khi toán hạng thứ hai của toán tử shift tăng 8:

int asInt = 0; 
for (int i = valueAsBytes.length-1; i >= 0; i--) 
    asInt |= valueAsBytes[i] & 0xFF << (valueAsBytes.length-i)*8; 
+0

Cảm ơn Eran nó đã làm việc !! –

2

Tôi có thể đề xuất giải pháp khác không?

Tôi nghĩ một vòng lặp không thêm bất kỳ "độ rõ ràng" nào vào mã này. Vấn đề thực sự là bạn đang sao chép mã như (valueAsBytes [i] & 0xFF) bốn lần. Nếu ở tất cả, bạn có thể làm một cái gì đó như:

int asInt = maskIndexedValueAndShiftBy(3, 0) | maskIndexedValueAndShiftBy(2, 8) | ... 

với

private final int maskIndexedValueAndShiftBy(int index, int shifter) { 
    return (valueAsBytes[index] & 0xFF) << shifter; 

Vòng lặp chỉ làm cho toàn bộ tính toán khó hiểu.

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