2012-07-25 20 views
10

Giả sử tôi có một bộ sưu tập dữ liệu (ví dụ: chuỗi) phải được lưu trữ trong một tệp nhị phân đệm sao cho mỗi chuỗi được căn chỉnh 4 byte.Cần có đệm máy tính để căn chỉnh n-byte

Vì vậy, nếu tôi có chuỗi có chiều dài là 11, nó sẽ được đệm thành 12 (có byte rỗng).
Nếu tôi có một chuỗi dài 24, thì không cần đệm.
Nếu chuỗi của tôi có chiều dài là 6, nó sẽ được đệm thành 8 byte.

Làm cách nào để tính toán lượng đệm yêu cầu trong một biểu thức?

tôi đã cố gắng 4 - (string_length % 4) nhưng nó không thành công khi chiều dài chuỗi của tôi là một bội số của 4.

Trả lời

13

này trông kỳ quặc nhưng cho câu trả lời đúng:

(4 - (string_length % 4)) % 4 
+0

Ah, mod kết quả. Không nghĩ về điều đó. – MxyL

11

Có một cách nhanh hơn để tính đệm, nếu căn chỉnh là sức mạnh của hai (2,4,8, ...). Sau đây là do số nhị phân & tương tự như% đối với quyền hạn của hai: %(2^x)&(2^x-1) làm tương tự cho số dương. Chú ý: & sẽ xóa bit dấu và do đó luôn trả về kết quả modulo dương.

Vì vậy, (4 - (string_length & 3)) & 3 sẽ làm tương tự như (4 - (string_length % 4)) % 4. Sử dụng thuộc tính modulo dương này có thể được đơn giản hóa thành (-string_length) & 3!


Nếu bạn muốn thêm kết quả đó đến kích thước mà bạn thậm chí có thể làm nhiều hơn tối ưu hóa:

padded_length = (string_length + 3) & ~3 Ngữ nghĩa này 'viên đạn lên' số với kích thước đệm của 4.

+1

Có tên chuẩn cho kỹ thuật này không? –

0
public static final int getByteAlignedIndex(final int pVariableDataIndex, final int pVariableDataLength, final int pByteAlignment) { 
    return pVariableDataIndex + (pVariableDataLength & 0xFFFFFFFC) + ((((pVariableDataLength & 0b1)|((pVariableDataLength & 0b10) >> 1))) << 2); 
} 
Các vấn đề liên quan