Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » 21. Virtualrätsel

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ] [ 4 ]
010
03.05.2003, 12:55 Uhr
~0xdeadbeef
Gast


Das muss natürlich --bitnr statt bitnr = bitnr>>1 sein.

Und als vierten hab ich noch einen unglaublich ineffizienten und bescheuerten, aber mir fiel kein guter mehr ein.

C++:
int bitscount(int value) {
    for(int bn = sizeof(int) * 8; bn > 0; --bn)
        if((value>>bn)&1) return 1 + bitscount(value - (1<<bn));
    return 0;
}


*AUA* nicht schlagen. Das tut weh
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
03.05.2003, 13:05 Uhr
Christian
C/C++ Master
(Operator)


Hi!

Klar, unter dem Gesichstpunkt schon, nur, es ging darum irgendeine Möglichkeit zu finden und da wollte ich nicht unbedingt die Standardlösung posten.
--
Grüße, Christian
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
03.05.2003, 14:21 Uhr
~0xdeadbeef
Gast


Einen hab ich noch.

C++:
const unsigned short bits[] =
    {0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
     1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
     1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
     2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
     1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
     2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
     2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
     3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8};

unsigned short bitcount(unsigned long zahl) {
    return  bits[ zahl        & 0xffu]
            + bits[(zahl >>  8) & 0xffu]
            + bits[(zahl >> 16) & 0xffu]
            + bits[(zahl >> 24) & 0xffu];
}


Das Feld bits ist eine Auflistung der Bitzahlen von 0 bis 255.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
03.05.2003, 14:22 Uhr
~0xdeadbeef
Gast


Auf einem 64bit-Prozessor muss das natürlich angepasst werden, aber für 32 bit sollte es so am schnellsten gehen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
03.05.2003, 20:21 Uhr
~0xdeadbeef
Gast


Noch eine kleine Verbesserung:

C++:
unsigned short bitcount(unsigned long zahl) {
  static const unsigned short bits[] =
    {0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,
     1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
     1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
     2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
     1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
     2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
     2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
     3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
     1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
     2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
     2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
     3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
     2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
     3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
     3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
     4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8};

  return  bits[ zahl        & 0xffu]
        + bits[(zahl >>  8) & 0xffu]
        + bits[(zahl >> 16) & 0xffu]
        + bits[(zahl >> 24) & 0xffu];
}


Damit man außerhalb der Funktion noch ein array bits anlegen kann.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
04.05.2003, 12:10 Uhr
virtual
Sexiest Bit alive
(Operator)



C++:
int bitcount (unsigned int n)
{
   n = (n & 0x55555555) + ((n >> 1) & 0x55555555) ;
   n = (n & 0x33333333) + ((n >> 2) & 0x33333333) ;
   n = (n & 0x0f0f0f0f) + ((n >> 4) & 0x0f0f0f0f) ;
   return n % 255 ;
}


Finde ich ne ziemlich geile Angelegenheit, wobei dies nicht auf meinem Mist gewachsen ist.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
04.05.2003, 14:32 Uhr
~0xdeadbeef
Gast


Puh...hast du nen Link, wo das erklärt wird? Ich hab grad ein bisschen Probleme, das nachzuvollziehen :/
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
04.05.2003, 14:35 Uhr
~0xdeadbeef
Gast


Nicht mehr nötig, ich glaub, ich habs gerallt. Aber das ist schon ein kranker Move...

Tja, die Grenze zwischen Genie und Wahnsinn ist ein schmaler Grat...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
04.05.2003, 14:43 Uhr
~0xdeadbeef
Gast


Übrigens wäre das am Ende n%256, sonst geht es nicht immer auf (glaub ich).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
04.05.2003, 14:44 Uhr
~0xdeadbeef
Gast


Vergiß das letzte, 255 ist schon richtig.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ] [ 4 ]     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: