Zählen der Bits einer int-Zahl, die 1 sind



  • Hallo!

    Verzweifel grad an einer aufgabe, die eigentlich gar nicht so schwer sein dürfte. es soll vom benutzer eine ganze zahl eingegeben werden und unter anderem deren bits gezählt werden, die gleich 1 sind. meine lösung dessen sieht folgendermaßen aus:

    for( int i=0, BitsGleich1=0; i<32; i++) {
    if( (ganzeZahl%2)==1 ) {
    BitsGleich1++;
    }
    ganzeZahl >> 1;
    }

    leider liefert mir das programm für BitsGleich1 aber immer einen wert von 4246800. die schleife wird aber doch nur 32 mal durchlaufen. steh wirklich auf dem schlauch 😞

    kann mir vielleicht jemand helfen??
    lg



  • Initialisiere BitsGleich1 vor der Schleife, sonst überdeckt der neue int BitsGleich1, den du im Schleifenkopf erstellt, die äußere Instanz.



  • Außerdem wird ganzeZahl nicht wirklich nach rechts geshifted:

    ganzeZahl >> 1;
    
    int result = 0;
    for ( ; x > 0; x >>= 1 )
    	result += x & 1;
    


  • ok, das mit der vorherigen initialisierung hat schon mal was genützt. danke!
    jetzt erhalte ich zb bei eingabe der ganzen zahl 3 den bitsgleich1-wert 1 und bei eingabe von 4 den wert 0, weshalb es wohl auch stimmt, dass die verschiebung nicht stattfindet. aber ich verstehe nicht, warum das so ist!



  • newbie007 schrieb:

    ok, das mit der vorherigen initialisierung hat schon mal was genützt. danke!
    jetzt erhalte ich zb bei eingabe der ganzen zahl 3 den bitsgleich1-wert 1 und bei eingabe von 4 den wert 0, weshalb es wohl auch stimmt, dass die verschiebung nicht stattfindet. aber ich verstehe nicht, warum das so ist!

    Weil der >> Operator den ursprünglichen Wert nicht verändert. Du musst den neuen Wert zuweissen oder gleich >>= verwenden.



  • ok, habe statt

    ganzeZahl >> 1

    jetzt einfach

    ganzeZahl >>= 1

    geschrieben und jetzt funktionierts! Danke! 🙂



  • Es gibt da noch diverse "BitHacks", u.a. auch welche zum Zählen der gesetzten Bits. Beispiel:

    int count(uint32_t x)
    {
      x -=  (x & 0xAAAAAAAA) >> 1;
      x  = ((x & 0xCCCCCCCC) >> 2) + (x & 0x33333333);
      x  = ((x & 0xF0F0F0F0) >> 4) + (x & 0x0F0F0F0F);
      x += (x >> 16);
      x += (x >>  8);
      return (x & 0xFF);
    }
    

    Es sieht komplizierter aus, könnte aber u.U. schneller sein.

    Gruß,
    SP


Anmelden zum Antworten