Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
--- Praktische Informatik (http://www.informatikerboard.de/board/board.php?boardid=6)
---- Softwaretechnik (http://www.informatikerboard.de/board/board.php?boardid=18)
----- Bitmanipulation (http://www.informatikerboard.de/board/thread.php?threadid=3784)


Geschrieben von user684 am 15.11.2017 um 17:00:

  Bitmanipulation

Man sollte ein Programm schreiben, welches die Einser im Bitmuster auszählt und ausgibt.
Dann die Reihenfolge der Bits umgekehrt und den Zahlenwert dann in einer anderen neuen unsigned int Variable speichert und dann beide Zahlen im Hexidezimalform ausgibt.

Ich habe das hier versucht, aber leider geht mein Programm nicht, könnt ihr mir bitte helfen?

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
#include <iostream>

using namespace std;


int main() {

    double z;
    unsigned int = 0;
    int eins=0;
    int null=0;
    int einerstelle;
    
    z=(sizeof(int*8));
    
    cout << "Geben Sie eine Zahl ein: " << endl;
    cin >> z;
     
   for(int i;i>=1;i--) {
     
       einerstelle = z & 1;
       if(einerstelle) {
            eins++;
      } else null++;
       z = z >> 1;
     
              
                    
           
    
    return 0;
}



Geschrieben von Karlito am 15.11.2017 um 18:13:

 

Hallo,

Pseudocode der Lösung:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:

count =0
inverse = 0

cin >> zahl

for (int i=0; i<sizeof(int)*8;i++)
{
 inverse <<= 1
 inverse += zahl & 1
 zahl >>=1
 count++
}

//Ausgabe


Hinweis: x<<=1 ist das gleiche wie x = x << 1

Anleitung für Ausgabe:
http://www.cplusplus.com/forum/windows/51591/

Besten Gruß,

Karlito



Geschrieben von user684 am 18.11.2017 um 09:06:

 

Tut mir leid, aber ich habe so was schon integriert in meinem Code , aber es fehlt trotzdem noch ein wichtiger Teil, aber ich weiß nicht, wie ich das realisiere..
Und mein int Parameter ist immer überladen und zeigt was außerhalb des Wertebereichs an....



Geschrieben von Karlito am 18.11.2017 um 09:40:

 

Ich habe dir die Grundlage für die gesamte Lösung gepostet. Wenn Du keine konkreten Fragen hast, kann ich dir nicht helfen.

Gruß,

Karlito



Geschrieben von user684 am 20.11.2017 um 13:34:

 

Bei mir kam aber ein Überlauf von Integer.....
Und viele hatten einen sehr langen Code u.a. auch mit do while Schleife.

Braucht man für das Programm wirklich ein paar Zeilen Code? Hab da so meine Zweifel. Trotzdem Danke.



Geschrieben von as_string am 20.11.2017 um 22:00:

 

Naja, das Programm hat Karlito ja explizit als Pseudocode gekennzeichnet.
Es kommt eine Warnung, wenn man die Laufvariable der for-Schleife als int deklariert. Vielleicht sollte man size_t verwenden oder es würde auch ein "unsigned int" reichen, was man auch bei den anderen Variablen verwenden sollte.
Allerdings ist ein Problem die count Variable. Da zählt Karlito bei jedem Schleifendurchlauf hoch, was aber, so wie ich die Aufgabe verstehe, nur passieren sollte, wenn gerade eine 1 an der Reihe ist (also wenn zahl & 1 true ist, allerdings dann vor dem zahl >>= 1 überprüfen!)

Gruß
Marco



Geschrieben von Karlito am 20.11.2017 um 22:15:

 

Ups, da ist mir ein fehler unterlaufen.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
count =0
inverse = 0

cin >> zahl

for (int i=0; i<sizeof(int)*8;i++)
{
 inverse <<= 1
 inverse += zahl & 1
 count+= zahl & 1
 zahl >>=1
}

//Ausgabe


Forensoftware: Burning Board, entwickelt von WoltLab GmbH