Vector problem



  • Hallo Leute ich brauche dringend Hilfe für eine Praktikumsaufgabe fürs studium.

    Ich brüte jetzt seit 2-3 Stunden über diesem Problem.
    Wir sollen eine ganze Zahl einlesen und in Bits ausgeben und zwar durch Bitoperatoren. Zuerst hatte ich nur die untenstehende Schleife und die ausgabe in der Schleife. Ohne Vector.
    Er hat mir die Zahlen natürlich aber verkehrt herum ausgegeben. ALso zb. die 6 in 011 statt 110.
    Dann habe ich es mit dem Vector versucht und nun gibt er mir nur noch Müll aus. Manchmal stimmt das ergebnis. Manchmal nicht. Und manchmal klatscht er mir sogar eine 32 hinten dran. Was ich auch tue es stimmt nix. Und ich bastel schon lange an diesem Vector rum.

    #include <cstdlib>
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    /*
     * 
     */
    int main() {
    
        int zahl, rest, zahl2=1;
        vector<int> bit;
    
        cout << "Bitte positive ganze Zahl eingeben: ", cin >> zahl;
    
        while (zahl2!=0){
            zahl2=zahl>>1;
    
            if(zahl2==0)
                rest=1;
            else
                rest=zahl%zahl2;
    
            bit.push_back(rest);
            //cout << rest;
            zahl=zahl2;
        }
        for (int i=1;i<=bit.size();i++)
            cout << bit[i];
    
        return 0;
    }
    

    Bitte helft mir ich weiß nicht mehr weiter...



  • Die Indizes in einem Vektor (und auch sonst für alles) gehen immer von 0 bis size-1, nicht von 1 bis size.



  • for (int i=0;i<=bit.size()-1;i++)
            cout << bit[i];
    

    Das hatte ich vorhin auch durchprobiert. Das löst das Problem mit der 32. Aber er gibt trotzdem nicht alles richtig aus.
    Habs jetzt nochmal so gemacht. Jetzt gibt er mir die 4 zb als 001 aus. Was auch nicht stimmt. Und die 12 als 0001. Und die 11 zb als 1101
    Das selbe Problem wie vorhin schon



  • Du wolltest doch den Vektor einführen, weil die Ausgabe verkehrt herum war. Irgendwas musst du dir dabei gedacht haben. Du bist nur nicht dazu gekommen, das vollständig umzusetzen. An der Stelle kannst du jetzt, da dein technisches Problem gelöst ist, aber weitermachen.



  • Versteh ich nicht. Woran soll ich weitermachen? Ich komm seit 3 Stunden nicht weiter. Und das mit dem vector.size()-1 hab ich schon vor ewigkeiten ausprobiert. Aber damit bin ich auch nicht weitergekommen



  • Wenn du schon soweit bist dass du die Zahlen "umgekehrt" ausgeben kannst, musst du doch jetzt nur noch jede Zahl die du ausgeben würdest in den vector werfen und ihn danach umgekehrt ausgeben. Wo ist das Problem?



  • for (int i=bit.size()-1;i>=0;i--)
            cout << bit[i];
    

    So etwa? Bin ich auch eben grad drauf gekommen 😃

    Jetz gibt er mir nur die Zahlen 12-15 falsch aus. Da macht er jeweils aus der 1 an der dritten stelle ne 0.
    Also
    12=1000
    13=1001
    14=1010
    15=1011
    ich glaub ich kann den ganzen algorithmus in die tonne treten.



  • Wie kann ich es sonst machen? Ich komm einfach auf keine Lösung...
    Ok habs endlich!!
    Danke leute



  • Cabooze schrieb:

    Ok habs endlich!!

    Zeig mal.



  • Ich bin ja ein Fan der Rekursion:

    string toBin(int number) {
      if (number == 0) {
        return "0";
      } else {
        const int rest = number % 2;
        number = number >> 1;
    
        return toBin(number) + to_string(rest);
      }
    }
    

    Allerdings nicht ganz ungefährlich, da das potentiell Stackoverflows erzeugen kann (selbst wenn das endrekursiv wäre. C++ kann das nicht optimieren). Bei dieser Funktion muss man sich allerdings keine Gedanken machen, da die Funktion einfach nicht oft genug aufgerufen wird.

    L. G.,
    IBV


Anmelden zum Antworten