Moeglicherweise bin ich hier nicht passend. .. Wie zaehlt man am Einfachsten die Anzahl Einsen in einem Integer, resp ist die Anzahl Einsen gerade, oder ungerade. Bsp 01001010 -> 3 -> ungerade 11010111 -> 6 -> gerade 00000000 -> 0 -> gerade
wenn du nur wissen willst, ob gerade oder ungerade: einfach alle Bits XOR.
Bits abcdefgh
1 | x=i^(i>>1); |
2 | y=x^(x>>2); |
3 | z=z^(z>>4); |
4 | if(z&1) ungerade parity |
Beitrag #4950556 wurde vom Autor gelöscht.
Vielen Dank fuer die Antworten. Popcnt() habe ich leider nicht. Es geht auch nicht ausschliesslich um einem PC. Aber der Vorschlag von Michael scheint gut zu sein.
dünnwandiger Trog schrieb: > Aber der Vorschlag von Michael > scheint gut zu sein. Nein nicht wirklich. Aber der Grundgedanke schon, er meint nämlich:
1 | x=i^(i>>1); |
2 | y=x^(x>>2); |
3 | z=y^(y>>4); // <- nicht z^(z>>4) |
4 | if(z&1) ungerade parity |
Es geht aber auch mit nur einer Variablen:
1 | i=i^(i>>1); |
2 | i=i^(i>>2); |
3 | i=i^(i>>4); |
4 | if(i&1) ungerade parity |
Für gcc: int __builtin_parity (unsigned int x) bzw. int __builtin_popcount (unsigned int x) dazu kann man sich dann mal das assembler Listing anschauen. Vorteil, hier sollte man für jede Architektur die so ziemlich beste Lösung haben! Aber prinzipiell ist die Antwort von laberkopp sehr gut und ich finde es schadet nicht mal von selbst auf so etwas gekommen zu sein ;)
squierrel schrieb: > Für gcc: > int __builtin_parity (unsigned int x) > bzw. > int __builtin_popcount (unsigned int x) > > dazu kann man sich dann mal das assembler Listing anschauen. > Vorteil, hier sollte man für jede Architektur die so ziemlich beste > Lösung haben! Und wer mag mit den Lösungen auf https://graphics.stanford.edu/~seander/bithacks.htm vergleichen
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.