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 ]
000
03.05.2003, 00:41 Uhr
virtual
Sexiest Bit alive
(Operator)


Schreibe ein Programm, welches die Bits in einem int Zählt. Also:

C++:
Bitte Zahl eingeben: 5
5 hat 2 gesetzte Bits


Die Fortgeschritteneren unter Euch sollten mit mindestens 4 verschiedenen Algorithmen aufwarten.
--
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
001
03.05.2003, 10:02 Uhr
Alois




C++:
int Bits(int Zahl)
{
    int a, b=0;

    for(int i=0; i<sizeof(int)*8; i++)
    {
        a = 1;
        a = a>>(sizeof(a)*CHAR_BIT-i) | (a<<i);
        a = a & Zahl;
        if(a!=0) b++;
        
    }

    return b;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
03.05.2003, 10:56 Uhr
virtual
Sexiest Bit alive
(Operator)


Hi,

Ich meine, daß man statt

C++:
a = 1
a = a>>(sizeof(a)*CHAR_BIT-i) | (a<<i);


einfach

C++:
a = 1<<i;


Schreiben könnte, denn:

C++:
a = 1
a = a>>(sizeof(a)*CHAR_BIT-i) | (a<<i);


ist eigentlich nix anderes als

C++:
a = 1>>(sizeof(a)*8-i) | (1<<i);


Und damit

C++:
   a = 0 | (1<<i); // also einfach 1<<i


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 03.05.2003 um 10:57 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
03.05.2003, 10:57 Uhr
~0xdeadbeef
Gast


Zählt das hier als Algorithmus? Ich meine, im wesentlichen sind das in diesem Fall hundert (das läßt sich aber leicht ändern) Konstanten untereinander geschrieben...

C++:
#include <iostream>

template <int i> class zahl {
public:
    static const int binaer_quersumme = (1&i ? 1 : 0) + zahl<i>>1>::binaer_quersumme;
};
class zahl<0> {
public:
    static const int binaer_quersumme = 0;
};

template<int i> class main_loop {
public:
    static void body() {
        main_loop<i-1>::body();
        std::cout << i << ":\t" << zahl<i>::binaer_quersumme << std::endl;
    }
};
class main_loop<-1> {
public:
    static void body() {}
};

int main(int argc, char *argv[]) {
    main_loop<100>::body();
    return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
03.05.2003, 10:58 Uhr
virtual
Sexiest Bit alive
(Operator)


@beefy : von Dir erwarte ich noch 3 weitere Lösungen!
--
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
005
03.05.2003, 10:59 Uhr
~0xdeadbeef
Gast


Den hab ich vergessen:
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
03.05.2003, 11:02 Uhr
~0xdeadbeef
Gast


Gib mir ein bisschen Zeit, mir was geiles einfallen zu lassen. Hat der x86 nicht nen bitcnt im Befehlssatz? Assembler...wollte ich immer schon mal lernen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
03.05.2003, 11:56 Uhr
~0xdeadbeef
Gast


OK, hier nochmal was einfaches:

C++:
#include <iostream>

template <bool b, int zahl, int i> class bq_loop { };
template <int zahl, int i> class bq_loop<false, zahl, i> {
public:
    static const int bq_iter = (zahl&i ? 1 : 0) + bq_loop<(i>zahl), zahl, 2*i>::bq_iter;
};
template <int zahl, int i> class bq_loop<true, zahl, i> {
public:
    static const int bq_iter = 0;
};

template <int i> class zahl {
public:
    static const int binaer_quersumme = bq_loop<false, i, 1>::bq_iter;
};


template <int i> class main_loop {
public:
    static void body() {
        main_loop<i-1>::body();
        std::cout << i << ":\t" << zahl<i>::binaer_quersumme << std::endl;
    }
};
class main_loop<-1> {
public:
    static void body() {}
};

int main(int argc, char *argv[]) {
    main_loop<100>::body();
    return 0;
}


Das komische Konstrukt mit den bools muss sein, weil der Compiler konstante x ? y : z-Ausdrücke scheinbar strikt auswertet und dann kein Schleifenabbrucht gegeben wäre. Bei der Konstruktion des Standards hat wohl keiner damit gerechnet, das jemals jemand auf eine so kranke Idee wie template-metaprogramming kommen könnte
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
03.05.2003, 12:30 Uhr
Christian
C/C++ Master
(Operator)


Hallo!

Okay, ich schlage folgendes vor: (kurz und knapp)


C++:
#include <iostream.h>

int bitscount(int value, int bitnr = (sizeof(int) * 8))
{    
    if(bitnr == 0)        return 0;    
    return bitscount(value, bitnr - 1) + ((value >> bitnr) & 1);
    
};

int main(int argc, char* argv[])
{
    int value = 0;
    cout << "Bitte Zahl eingeben:";
    cin >> value;
    int bits = bitscount(value);

    cout << "Bits: " << bits;
};



Grüße, Christian
--
Grüße, Christian
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
03.05.2003, 12:46 Uhr
~0xdeadbeef
Gast


Das würde ich eher ins iterative umwandeln, um konstanten Speicherverbrauch zu erreichen:

C++:
int bitscount(int value) {
    int ret = 0;
    for(int bitnr = sizeof(int) * 8; bitnr > 0; bitnr = bitnr>>1)
        ret += (value>>bitnr) & 1;
    return ret;
}

 
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: