bit twiddling hacks strona zaproponować następującą bardzo wydajną funkcję odwrócenia bitów:funkcja Bitswap użyciu szablonu metaprogramowanie
// Bitswap: reverse the bits of the value of unsigned integral type T
template <class T>
constexpr T bitswap(T src)
{
constexpr std::size_t char_bit = std::numeric_limits<unsigned char>::digits;
constexpr std::size_t digits = sizeof(T) * char_bit;
std::size_t size = digits;
T mask = ~T();
while ((size >>= 1) > 0) {
mask ^= (mask << size);
src = ((src >> size) & mask) | ((src << size) & ~mask);
}
return src;
}
- Czy istnieje jakiś sposób, aby przyspieszyć tę funkcję przy użyciu szablonu METAPROGRAMOWANIE rekursji rozwinąć pętlę?
- Czy istnieje sposób, aby działał z rozszerzonymi typami, takimi jak
__uint128_t
? (oryginalna wersja działa z__uint128_t
) - Czy ta funkcja działa teoretycznie, aby odwrócić bity typów przy braku mocy dwóch bitów, jeśli
digits
jest poprawnie zainicjalizowany do poprawnej liczby bitów? (na przykład hipotermicznyuint41_t
).
czy sprawdziłeś, czy 1. rozwijany jest tekst inny niż szablonowy, 2. czy rekursywny, który bierze drugi parametr, digitsleft jest rozwijany (prawdopodobnie z pomocnikiem)? – lorro
Większość kompilatorów w dzisiejszych czasach wie wystarczająco dużo, aby rozwinąć pętle w miarę potrzeby podczas korzystania z optymalizacji, więc nie martwiłbym się o to, gdyby nie działał wolniej z optymalizacją niż bez. – JAB