Musiałem to robić wiele razy w przeszłości i nigdy nie byłem zadowolony z wyników.Jaki jest skuteczny algorytm czasu do kopiowania niezarządzanych macierzy bitowych?
Czy ktoś może zaproponować szybki sposób kopiowania sąsiadującej tablicy bitów ze źródła do miejsca docelowego, w którym zarówno źródło, jak i miejsce docelowe mogą nie być wyrównane (przesunięte w prawo) na dogodnych granicach procesora?
Jeśli zarówno źródło, jak i cel nie są wyrównane, problem można szybko zmienić na taki, w którym tylko jeden z nich nie jest wyrównany (po napisaniu pierwszej kopii).
Jako punkt wyjścia, mój kod nieuchronnie kończy się szuka czegoś podobnego następujące (niesprawdzonych ignorować skutków ubocznych jest to tylko przy mankiecie przykład):
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) /* ... */
}
}
(faktycznie jest to lepiej niż ja” To nie wygląda zbyt źle)
Wykorzystanie 'struct' (ów) z polami bitowymi i niech kompilator to zrobić? : P –
* Jak * może to poprawić sytuację? – Jamie
Czy te pola binarne zachodzą na siebie? Czy potrafisz przekształcić problem w problem, który można rozwiązać, po prostu stosując memcpy? memcpy w Visual C++ jest wysoce zoptymalizowany (/ ARCH: SSE2), a GCC i przyjaciele przynajmniej upewniają się, że osiągnęli granice parowania przed skopiowaniem dużych porcji. –