Was wäre eine schnelle und elegante Möglichkeit, die ersten (am wenigsten signifikanten) 2 verschiedene aufeinanderfolgende Bits in einer vorzeichenlosen Ganzzahl zu tauschen?Wie tausche ich zuerst 2 aufeinanderfolgende verschiedene Bits
z.
100100 -> 100010
110011 -> 110101
Bisher kam ich mit auf den Punkt:
unsigned long long special_swap(unsigned long long number)
{
if (number & 1)
return (number + 1)^((number^(number + 1)) >> 2);
number = ~number;
return ~((number + 1)^((number^(number + 1)) >> 2));
}
Meine größte Unzufriedenheit mit der obigen Lösung ist, dass sie die if
Befehl verwendet.
Was ist zuerst? Am weitesten links? Ganz rechts? – sehe
Interessant: https://graphics.stanford.edu/~seander/bithacks.html#SwappingBitsXOR – sehe
Erstellen Sie eine Hash-Tabelle aller 256 möglichen Zustände, in denen ein Byte enthalten sein kann, und die gewünschte Transformation. Dann mach einfach den Blick nach oben. Wiederholen Sie den Vorgang für das nächste Byte, falls erforderlich. –