Pracuję z danymi dźwiękowymi. Chciałbym odtworzyć przykładowy plik w odwrotnej kolejności. Dane są przechowywane jako unsigned ints i zapakowane ładnie i mocno. Czy istnieje sposób, aby zadzwonić pod numer memcpy
, który zostanie skopiowany w odwrotnej kolejności. tj. gdybym miał 1,2,3,4 przechowywane w tablicy, czy mogę zadzwonić memcpy
i magicznie odwrócić je, więc otrzymuję 4,3,2,1.C Notatka na odwrocie
Odpowiedz
Działa to na kopiowanie int
s odwrotnie:
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];
}
Podobnie jak memcpy()
, regiony wskazał-to przez dst
i src
nie mogą się pokrywać.
Jeśli chcesz, aby odwrócić na miejscu:
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;
}
}
Obie funkcje powyżej są przenośne. Możesz je przyspieszyć, używając specyficznego dla sprzętu kodu.
(nie testowałem kod poprawności.)
jaka jest efektywność tego w porównaniu z memcpy? –
'memcpy' powinno być O (n), podobnie jak funkcja' reverse_memcpy'. – dreamlax
Z moimi szybkimi testami, przy optymalizacji '-O3',' reverse_memcpy() 'jest około 3 razy wolniejsze niż' memcpy() 'dla kopiowania 1000000 bajtów. Dla 10000 iteracji ze 1000000 bajtów, 'memcpy()' zajęło 4 sekundy, a 'reverse_memcpy()' wziął 11. Ale te liczby są dla bardzo konkretnego przypadku, więc możesz chcieć przetestować rzeczy dla siebie. Oczywiście, jak powiedział dreamlax, oba są O (n). –
Nie, memcpy nie zrobi tego w tył. Jeśli pracujesz w C, napisz funkcję, aby to zrobić. Jeśli naprawdę pracujesz w C++, użyj std :: reverse lub std :: reverse_copy.
Wiem, że to jest stare, ale czy możesz wysłać przykład funkcji, która to robi? To proste, ale może pomóc komuś. –
- 1. Zachowanie odwrocie >> = (==)
- 2. Co oznacza notatka w Elixir?
- 3. Notatka TypeScript nierozliczona i wyliczeniowa
- 4. Jak podzielić łańcuch java na odwrocie odwrotnym ukośnika
- 5. Jakiego elementu użyć na odwrocie: <abbr>
- 6. FBSDKCorekit.h, notatka do pliku FBSDKCopying.h znaleziona przy użyciu Cocoapods
- 7. Notatka o programie dla nieznanej klasy "Obiekt" z Androidem Studio i Gradle
- 8. Konwersja źródła C na C++
- 9. Globbing w C++/C, na Windows
- 10. Konwertowanie funkcji z C++ na C#
- 11. Masowe tłumaczenie C# na cel C
- 12. Język C/C kod ++ na platformie Android
- 13. Rysunek na C# Bitmap z C++
- 14. URL podzielony na C#?
- 15. foreach na liście [C#]
- 16. C# int na bajt []
- 17. Tłumaczenie C na JavaScript
- 18. Zamień "na \" w C#
- 19. Zestaw na wektor C++
- 20. Konwertuj C# na PHP
- 21. C ciąg na duże litery w C i C++
- 22. C++ na przykładzie C++ nie rozpoznaje C++, dlaczego?
- 23. Zezwalanie na wtyczki C# na haki aplikacji
- 24. zlib z C++ na C# (Jak konwertować bajt [] na strumień i strumień na bajt [])
- 25. Obiektywne wiązanie C na MonoTouch
- 26. C++ napisz na początku pliku
- 27. C++: Konwertuj wchar_t * na BSTR?
- 28. C# String zamień na słownik
- 29. na podstawie pętli w C++
- 30. C++: przekonwertuj wektor na krotkę
C nie posiada funkcję takiego, ale to bardzo łatwo napisać. –
Być może warto zastanowić się nad zmianą sposobu * iteracji * nad danymi, zamiast zmieniać kolejność, podejrzewam, że byłaby bardziej efektywna ... –
Masz mnie zafascynowany * magicznie *. –