Sto lavorando con dati audio. Mi piacerebbe riprodurre il file di esempio al contrario. I dati vengono memorizzati come valori non firmati e imballati in modo piacevole e stretto. C'è un modo per chiamare memcpy
che verrà copia in ordine inverso. Ad esempio, se avessi memorizzato 1,2,3,4 in un array, potrei chiamare memcpy
e magicamente invertirli così ottengo 4,3,2,1.C memcpy al contrario
risposta
Questo funziona per la copia di int
s in senso inverso:
void reverse_intcpy(int *restrict dst, const int *restrict src, size_t n)
{
size_t i;
for (i=0; i < n; ++i)
dst[n-1-i] = src[i];
}
Proprio come memcpy()
, le regioni rilevare-to da dst
e src
non devono sovrapporsi.
Se si vuole invertire sul posto:
void reverse_ints(int *data, size_t n)
{
size_t i;
for (i=0; i < n/2; ++i) {
int tmp = data[i];
data[i] = data[n - 1 - i];
data[n - 1 - i] = tmp;
}
}
Entrambe le funzioni sopra sono portatili. Potresti essere in grado di renderli più veloci utilizzando il codice specifico dell'hardware.
(non ho ancora testato il codice per correttezza.)
qual è l'efficienza di questo rispetto alla memcpy? –
'memcpy' dovrebbe essere O (n) e così dovrebbe questa funzione' reverse_memcpy'. – dreamlax
Con il mio test rapido, con l'ottimizzazione '-O3',' reverse_memcpy() 'è circa 3 volte più lento di' memcpy() 'per copiare 1000000 byte. Per 10000 iterazioni con 1000000 byte, 'memcpy()' ha impiegato 4 secondi e 'reverse_memcpy()' ha preso 11. Ma questi numeri sono per un caso molto specifico, quindi potresti voler testare le cose da solo. Naturalmente, come ha detto Dreamlax, entrambi sono O (n). –
No, memcpy non lo farà all'indietro. Se stai lavorando in C, scrivi una funzione per farlo. Se stai davvero lavorando in C++ usa std :: reverse o std :: reverse_copy.
So che questo è vecchio, ma potresti pubblicare un esempio di una funzione che fa questo? È semplice, ma potrebbe aiutare qualcuno. –
C non ha una funzione del genere, ma è molto facile scrivere uno. –
Potrebbe valere la pena considerare di cambiare il modo in cui si * itera * sui dati piuttosto che cambiare l'ordine, temo che sarebbe più efficiente ... –
Mi hai fatto inciampare * magicamente *. –