Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Softwaretechnik » Bitmanipulation » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Bitmanipulation
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
user684
Jungspund


Dabei seit: 09.11.2017
Beiträge: 11

Bitmanipulation Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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;
}
15.11.2017 17:00 user684 ist offline Beiträge von user684 suchen Nehmen Sie user684 in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
15.11.2017 18:13 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
user684
Jungspund


Dabei seit: 09.11.2017
Beiträge: 11

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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....
18.11.2017 09:06 user684 ist offline Beiträge von user684 suchen Nehmen Sie user684 in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
18.11.2017 09:40 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
user684
Jungspund


Dabei seit: 09.11.2017
Beiträge: 11

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.
20.11.2017 13:34 user684 ist offline Beiträge von user684 suchen Nehmen Sie user684 in Ihre Freundesliste auf
as_string as_string ist männlich
Haudegen


Dabei seit: 06.11.2013
Beiträge: 639
Herkunft: Heidelberg

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
20.11.2017 22:00 as_string ist offline E-Mail an as_string senden Beiträge von as_string suchen Nehmen Sie as_string in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
20.11.2017 22:15 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Softwaretechnik » Bitmanipulation