Im ersten Schritt solltest Du versuchen, Dein Programm compilierfÀhig zu machen. Dein Code oben ist nur ein Fragment aus Codeschnipseln. Folgende Dinge sind da essentiell:
1. jede Variable hat einen Typ und einen Namen und sollte zum Zeitpunkt der Deklaration auch initialisiert werden
unsigned int = 0; // ist falsch hier fehlt der Name
unsigned int zahl = 0; // korrekt eine Variable mit Typ 'unsigned int' und Namen 'zahl' wird mit 0 initialisiert
2. auf jede geöffnete Klammer '{' muss eine schlieĂende '}' folgen. Gewöhne Dir an, den Code entsprechend zu formatieren, d.h. rĂŒcke die Zeile nach jeder geöffneten Klammer ein. Also z.B. so:
for( int i=8*sizeof(unsigned int); i>0; --i ) // auch hier muss 'i' initialisiert werden
{ // offenen Klammer
if( .... )
{ // offen
// mehr Code noch mehr eingerĂŒckt
} // geschlossen
} // geschlossen Klammer
Wenn Du den Code kompilierst und Du erhĂ€ltst Fehler, so entferne sie und den stelle den Code erst vor, wenn der Compiler keinen Fehler mehr liefert. Wenn Du Schwierigkeiten hast, gehe in kleinen Schritten vor. Schreibe erst wenige Zeilen, kompiliere sie und erst wenn dies fehlerfrei ist, dann fĂŒge weiter Zeilen hinzu.
Aber bevor Du dies machst, prĂŒfe erst mit dem Debugger oder einer Ausgabe, ob der Code auch das macht, was Du denkst.
3.) Zerlege das Problem in kleine StĂŒcke (Funktionen) und packe jede FunktionalitĂ€t in eine eigen Funktion (bzw. spĂ€ter Klasse)
zum ersten Problem: "... die Anzahl der vorkommenden Einsen im Bitmuster zÀhlt und ausgibt " könnte so aussehen:
int zaehle_1erBits( unsigned int x )
{
int anzahl = 0;
// solange x!=0 ist, sind noch 1'en in x enthalten
for( ; x != 0; x >>= 1 ) // mit jedem Durchlauf werden alle Bits nach links verschoben
{
if( x & 1 ) // tritt eine 1 im Bit0 auf, so wird sie gezaehlt
++anzahl;
}
return anzahl;
}
Im Unterschied zu Deinem Code lĂ€uft die Schleife nicht ĂŒber alle Bits von unsigned int, sondern bricht ab, sobald die Variable 'x' zu 0 wird. Denn dann sind keine Einsen mehr enthalten. Und wenn Du so eine kleine Funktion fertig hast, so teste sie ausfĂŒhrlich:
int main()
{
using namespace std;
for( unsigned int zahl; cin >> zahl; )
{
cout << "Die Anzahl der 1'en in " << zahl << " ist " << zaehle_1erBits( zahl ) << endl;
}
return 0;
}
Erst wenn das gut funktioniert (gebe auch eine 0 oder eine negative Zahl ein), dann gehe zum nÀchsten Problem
"... die Reihenfolge der Bits umkehrt und den entstehenden Zahlenwert in einer neuen unsigned int Variable speichert"
Ăberlege, was genau zu tun ist. Sicher musst Du in einer Schleife ĂŒber alle Bits laufen und jedes Bit an die entgegen gesetzte Stelle des Ergebnisses wieder eingefĂŒgt werden. Beginne mit einer Funktion und einer Schleife
unsigned reverse_Bits( unsigned int x )
{
for( int i = 0; i < 8*sizeof(unsigned int); ++i )
{
std::cout << i << std::endl; // nur zur Kontrolle der Schleife
}
return 0;
}
.. und bevor es weiter geht, prĂŒfe die Schleife mit dem Debugger oder einer Ausgabe wie oben, ob sie auch das tut, was Du denkst. In diesem Fall sollten die Zahlen von 0 bis 31 ausgegeben werden (bei ĂŒblicher 32Bit Architektur). Im nĂ€chsten Schritt prĂŒfe ob an der betreffende Stelle eine 1 in 'x' steht.
unsigned reverse_Bits( unsigned int x )
{
for( int i = 0; i < 8*sizeof(unsigned int); ++i, x >>= 1 ) // x bei jeden Schritt nach rechts shiften
{
int bit = x & 1; // durch das Shiften steht das Bit mit Index 'i' jetzt an Position 0
std::cout << "Bit " << i << " = " << bit << std::endl;
}
return 0;
}
Rufst Du die Funktion mit 23 auf, so sollte die Ausgabe der ersten Bits dann so aussehen:
Bit 0 = 1
Bit 1 = 1
Bit 2 = 1
Bit 3 = 0
Bit 4 = 1
Bit 5 = 0
da \(23 = 2^0 + 2^1 + 2^2 + 2^4 = 1 +2 + 4 + 16\) ist. Alle weiteren Bits sollten =0 sein.
Erst jetzt das Ergebnis zusammen bauen:
unsigned int reverse_Bits( unsigned int x )
{
unsigned int ergebnis = 0;
for( int i = 0; i < 8*sizeof(unsigned int); ++i, x >>= 1 )
{
ergebnis <<= 1;
int bit = x & 1;
if( bit != 0 )
{
ergebnis |= 1;
}
std::cout << "Bit " << i << " = " << bit << " Ergebnis = 0x" << std::hex << ergebnis << std::dec << std::endl;
}
return ergebnis;
}
Die Ausgabe (von 'ergebnis') erfolgt im Hexadezimalformat und ist daher besser zu kontrollieren. So jetzt versuche es bitte mal allein. Wenn Du Fragen hast (wirst Du haben!), dann melde Dich einfach.
GruĂ Werner