Forum: PC-Programmierung Anzahl Einsen in einem Integer


von dünnwandiger Trog (Gast)


Lesenswert?

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

von Tobias L. (murxwitz)


Lesenswert?

wenn du nur wissen willst, ob gerade oder ungerade: einfach alle Bits 
XOR.

von Michael B. (laberkopp)


Lesenswert?

Bits abcdefgh
1
x=i^(i>>1); 
2
y=x^(x>>2); 
3
z=z^(z>>4);
4
if(z&1) ungerade parity

von c.m. (Gast)


Lesenswert?

POPCNT mod 2?

von c.m. (Gast)


Lesenswert?

ne. popcnt und ergebnis letztes bit testen.

Beitrag #4950556 wurde vom Autor gelöscht.
von dünnwandiger Trog (Gast)


Lesenswert?

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.

von Edi R. (edi_r)


Lesenswert?

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

von squierrel (Gast)


Lesenswert?

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 ;)

von Arc N. (arc)


Lesenswert?

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
Noch kein Account? Hier anmelden.