Tôi đã phải làm điều này nhiều lần trong quá khứ và tôi chưa bao giờ hài lòng với kết quả.Thuật toán hiệu quả thời gian để sao chép mảng bit không được ký hiệu là gì?
Bất cứ ai có thể đề xuất cách sao chép nhanh mảng bit liền kề từ nguồn đến đích nơi cả nguồn và đích có thể không căn chỉnh (phải dịch chuyển) trên ranh giới bộ xử lý thuận tiện?
Nếu cả nguồn và đích không được căn chỉnh, vấn đề có thể nhanh chóng được thay đổi thành một nơi mà chỉ có một trong số chúng không được căn chỉnh (sau bản sao đầu tiên nói).
Như một điểm khởi đầu, mã của tôi chắc chắn sẽ trông giống như sau (, bỏ qua tác dụng phụ chưa được kiểm tra này chỉ là một off the dụ cuff là):
const char mask[8] = { 1, 3, 7, 15, 31, 63, 127, 255 };
/* Assume:
* - destination is already zeroed,
* - offsets are right shifts
* - bits to copy is big (> 32 say)
*/
int bitarray_copy(char * src, int src_bit_offset, int src_bit_len,
char * dst, int dst_bit_offset) {
if (src_bit_offset == dst_bit_offset) { /* Not very interesting */
} else {
int bit_diff_offset = src_bit_offset - dst_bit_offset; /* assume positive */
int loop_count;
char c;
char mask_val = mask[bit_diff_offset];
/* Get started, line up the destination. */
c = (*src++ << bit_diff_offset) | ((*src >> (8 - bit_diff_offset)) & mask_val);
c &= mask[8-dst_bit_offset];
*dst++ |= c;
src_bit_len -= 8 - dst_bit_offset;
loop_count = src_bit_len >> 3;
while (--loop_count >= 0)
* dst ++ = (*src++ << bit_diff_offset) | ((*src >> (8 - bit_diff_offset)) & mask_val);
/* Trailing tail copy etc ... */
if (src_bit_len % 8) /* ... */
}
}
(thực ra đây là tốt hơn so với tôi đã thực hiện trước đó. Nó không quá xấu)
Sử dụng 'struct' (s) với các trường bit và cho phép trình biên dịch làm điều đó? : P –
* Cách * cải thiện mọi thứ? – Jamie
Các trường bit này có trùng lặp không? Bạn có thể biến vấn đề thành một vấn đề có thể được giải quyết bằng cách đơn giản áp dụng memcpy? memcpy trên Visual C++ được tối ưu hóa cao (/ ARCH: SSE2), và GCC & bạn bè làm ít nhất đảm bảo họ đạt đến ranh giới đoạn trước khi sao chép các đoạn lớn. –