Zahl -> Bit ausgabe



  • Aoki_san schrieb:

    if (/* TODO: höchstes Bit */ (Zahl& UINT_MAX) != 0)
    

    Also jetzt steht x für ein unbestimmtes Bit, entweder 0 oder 1:

    iEnd = sizeof(Zahl) * 8;
              |<-  iEnd ->|
    Zahl:     xxxx ... xxxx
    UINT_MAX: 1111 ... 1111
    &:        xxxx ... xxxx
    

    Wie du siehst erreichst du damit nicht viel. Wenn man nur Einsen in der Maske hat dann bleibt die Eingabe unverändert. Wir wollen aber nur das höchste Bit haben, alle anderen sollen 0 sein. Du kannst dir das auch als eine Art Gleichungssystem aufschreiben:

    Zahl:  xxxx ... xxxx
    Maske: ???? ... ????
    &:     x000 ... 0000
    

    Immer überlegen, was mit was verknüpft was ergibt bei der Bitweise-Und-Operation. Wahrheitstabelle kann helfen wenn du noch nicht so sicher bist.

    Aoki_san schrieb:

    wenn ich möchte das das zweite bit als höchstes steht muss ich das erste bit runter setzen oder nicht?

    Formalitäten (wie den Code den ich dir gegeben habe) nehme ich gern ab. Denkarbeit nicht. Denn dabei lernt man ja effektiv 'was. Analog beim Raten. Wenn man rät, dann funktioniert das Programm vielleicht irgendwann, aber man hat dabei nichts gelernt. Das kann kaum das Ziel sein (damit möchte ich dir nicht unterstellen, dass du rätst; ich äussere es eher mit einem pro­phy­lak­tischen Gedanken).
    Also du überlegst dir folgendes:
    Wir haben eine Schleife. Diese durchlaufen wir genau so oft wie unsere Zahl Bits hat. Dabei ist bei jedem Durchlauf ein anderes Bit oben. Kann dann jemals ein Bit zwei Mal zuoberst sein?
    Oder noch viel einfacher:
    Wir geben eine Zahl in der binären Schreibweise aus. Werden gewisse Bits mehrfach ausgegeben?

    Aoki_san schrieb:

    also bit 1 auf 0 setzen oder nicht?

    In der Programmierung zählt man immer von 0 weg. Das solltest du dir angewöhnen. Auch damit du weniger Kommunikationsschwiergkeiten mit anderen Leuten hast. Bit 0 ist das niederwertigste Bit (LSB). Und vorhin hast du ja herausgefunden, was links hinzugefügt wird, wenn man nach rechts schiebt (und umgekehrt). Da musst du nichts manuell hinzufügen. Und auch wenn, wieso solltest du das tun wollen?

    Also ich skizziere dir mal unser Vorhaben, vielleicht wird es dir dann klarer:

    Zahl = 1010  i = 0  Konsolenausgabe:
    
    Schleifendurchgang:
        Ist i noch im gültigen Bereich? Ja -> Fortfahren
        Ist das höchste Bit von Zahl gesetzt? Ja -> 1 ausgeben
        Zweithöchstes Bit an die Stelle vom höchsten schieben
    
    Zahl = 0100  i = 1  Konsolenausgabe: 1
    
    Schleifendurchgang:
        Ist i noch im gültigen Bereich? Ja -> Fortfahren
        Ist das höchste Bit von Zahl gesetzt? Nein -> 0 ausgeben
        Zweithöchstes Bit an die Stelle vom höchsten schieben
    
    Zahl = 1000  i = 2  Konsolenausgabe: 10
    
    Schleifendurchgang:
        Ist i noch im gültigen Bereich? Ja -> Fortfahren
        Ist das höchste Bit von Zahl gesetzt? Ja -> 1 ausgeben
        Zweithöchstes Bit an die Stelle vom höchsten schieben
    
    Zahl = 0000  i = 3  Konsolenausgabe: 101
    
    Schleifendurchgang:
        Ist i noch im gültigen Bereich? Ja -> Fortfahren
        Ist das höchste Bit von Zahl gesetzt? Nein -> 0 ausgeben
        Zweithöchstes Bit an die Stelle vom höchsten schieben
    
    Zahl = 0000  i = 4  Konsolenausgabe: 1010 (sieht so aus wie Zahl zu Beginn)
    
    Schleifendurchgang:
        Ist i noch im gültigen Bereich? Nein -> Ende Gelände
    


  • So, nach langen Ueberlegungen habe ich es raus gefunden. Ich habe zwar einige male nach Aehnlichen Themen gegoogelt um raus zu finden, ob ich etwas vergessen habe zu machen, bzw. um zu schauen ob ich richtig verstanden habe. Doch jetzt kann ich mir erklären wie ich genau vorgehen muss und was ich machen muss, deshalb gehe ich davon aus, dass ich es verstanden habe.(\(.)/) Ich muss nur noch zusehen, dass ich den ersten Bit nach jedem Schleifendurchlauf um einen nach links verschieben kann.
    Ich verwende bei der ersten if Anweisung mittlerweile folgenden befehl:
    if(Zahl& (1 << 32) != 0)


  • Mod

    Wenn du eine 1 um 32 Stellen nach links verschiebst, an der wievielten Stelle steht die 1 dann hinterher? Um es leichter zu machen: Wenn du eine 1 um 2 Stellen nach links verschiebst, an welcher Stelle steht sie dann?

    Ich glaube, da ist auch noch irgendwo eine Frage in deinem letzten Beitrag, aber mangels Satzzeichen kann ich sie nicht erkennen.



  • 32 Stellen:
    1000 0000 0000 0000 0000 0000 0000 0000
    2 stellen
    100

    Durchlauf 1:
    0000 0000 0000 0000 0000 0000 0000 0001
    1000 0000 0000 0000 0000 0000 0000 0000

    Durchlauf 2:
    0000 0000 0000 0000 0000 0000 0000 0010
    1000 0000 0000 0000 0000 0000 0000 0000

    Usw also so habe ich es mir zumindest gedacht



  • Oh, ok. Ich bearbeite kurz den Text, damit es besser lesbar für euch ist.
    Edit: Fertig bearbeitet

    Aoki_san schrieb:

    So, nach langen Ueberlegungen habe ich es raus gefunden. Ich habe zwar einige male nach Aehnlichen Themen gegoogelt um raus zu finden, ob ich etwas vergessen habe zu machen, bzw. um zu schauen ob ich richtig verstanden habe. Doch jetzt kann ich mir erklären wie ich genau vorgehen muss und was ich machen muss, deshalb gehe ich davon aus, dass ich es verstanden habe.(\(.)/) Ich muss nur noch zusehen, dass ich den ersten Bit nach jedem Schleifendurchlauf um einen nach links verschieben kann.
    Ich verwende bei der ersten if Anweisung mittlerweile folgenden befehl:
    if(Zahl& (1 << 32) != 0)



  • Aoki_san schrieb:

    32 Stellen:
    1000 0000 0000 0000 0000 0000 0000 0000
    2 stellen
    100

    Interessante Art zu zählen.


  • Mod

    Aoki_san schrieb:

    32 Stellen:
    1000 0000 0000 0000 0000 0000 0000 0000
    2 stellen
    100

    🙄 Fällt dir da gar nicht auf? Ok, dann eben explizit: Gib mal zu jeder Zahl zwischen 2 und 32 an, wo die 1 landet, wenn du sie um diese Anzahl stellen nach links verschiebst.



  • Achsoo oops 😃 sorry



  • Das heißt aber das ich nur die 32 in 1 umändern muss 😮
    Aber wieso funktioniert das programm immer noch nicht korrekt? :///

    #include <iostream>
    using namespace std;
    
    int main() {
    	// your code goes here
    unsigned Zahl = 1;
    for (int i = 0; i < 32; ++i){
    if (Zahl&(1 << 1) != 0)
    cout << 1 << " ";
    else 
    cout << 0 << " ";
    
    Zahl = Zahl << 1;
    }
    	return 0;
    }
    

  • Mod

    if (Zahl&(Zahl << 0) != 0)
    

    Rätst du bloß?
    edit: Jetzt hast du editiert und daraus (1 << 1) gemacht. Was meine Vermutung mit dem Raten nochmals untermauert. Was ist denn 1 << 1 deiner Meinung nach?

    Das heißt aber das ich nur die 32 in 1 umändern muss 😮

    Ich kann deine Gedanken überhaupt nicht mehr nachvollziehen. Welche Schlüsse hast du denn aus meiner Bemerkung zur 32 gezogen, die dich zu obigem Zitat bringen?



  • Ne habe gerade gesehen das ich die falsche ideone seite offen hatte
    (Habe mehrere codes auspeobiert da keines zum richtigen ergebnis führte)
    Die eigentliche if anweisung war if(Zahl&(1 << 1)!=0);



  • Nunja wenn ich auf 1 stehe und jedesmal 32 weiter nach linkslaufe überschreite ich die eigentliche grenze nach einem durchlauf oder nicht? Deshalb hab ich es auf 1 gesenkt


  • Mod

    Aoki_san schrieb:

    (Habe mehrere codes auspeobiert da keines zum richtigen ergebnis führte)

    Also liege ich richtig mit der Annahme, dass du gerade nur wild herum probierst.

    Zitat eines früheren Moderators:

    c.rackwitz schrieb:

    Wenn du selber Code schreibst, musst du ihn auch verstehen. Code ist kein Haufen von wahllos zusammengeschmissenen Buchstaben und Zeichen, Code ist Logik pur. Du musst genau wissen, warum du wo und welches Zeichen setzt.

    Was ist denn (1 << 1)? Was willst du an der Stelle haben? Hast du überhaupt verstanden, was & und << machen? Was ist die Idee an diesem Code? asfdlol hat sie ja eigentlich schon recht schön und ausfühlrich erklärt, aber du scheinst bloß blind seinen Ansatz genommen zu haben, ohne ihn zu verstehen (möglicherweise nicht einmal versucht, ihn zu verstehen?) und versuchst nun verzweifelt zu raten, was an die Stellen kommt, die asfdlol bewusst frei gelassen hat.



  • Nein ich rate nicht ich denke und probiere es aus.
    Ich habe mir gedacht das die 1 ja bei 32 bit so dargestellt wird :
    0000 0000 0000 0000 0000 000 0 0000 0001
    Und die Zahl die eingegeben wurde ja
    Auch 0000 0000 0000 0000 0000 0000 0000 0001
    Ist und durch Zahl&(1 << 1) der wert der hinter (1 << 1) steckt binär umgewandelt wird danach werden die binär zahlen nach jeder schleife verglichen da in den klammer 1 << steht wird auch nah jeder schleife die binärzahl um eines verschoben der wert der in der mask gespeichert wird kann damit nur 0 oder 1 sein wenn sich also mask(wert 1) und mask (zahl) treffen sollten wird eine eins ausgegeben und je länger ich darüber nachdenke wird mir klar das ich es richtig gemacht habe nur wird bei dieser schleife nicht vorne sondern hinten angefangen und deshalb steht der letzte wert vorne und nicht hinten hmm dann muss ich wohl schauen wie ich das ändern kann ich hoffe ihr könnt mir noch folgen



  • Oh man, I pack it not.
    Ein waschechter Infinite Monkey Programmer.



  • Jap ich merke es auch gerade -.-
    Boa naja egal ist jetzt auch nicht mehr so wichtig



  • Aoki_san schrieb:

    Ist und durch Zahl&(1 << 1) der wert der hinter (1 << 1) steckt binär umgewandelt wird danach werden die binär zahlen nach jeder schleife verglichen da in den klammer 1 << steht wird auch nah jeder schleife die binärzahl um eines verschoben der wert der in der mask gespeichert wird kann damit nur 0 oder 1 sein wenn sich also mask(wert 1) und mask (zahl) treffen sollten wird eine eins ausgegeben und je länger ich darüber nachdenke wird mir klar das ich es richtig gemacht habe nur wird bei dieser schleife nicht vorne sondern hinten angefangen und deshalb steht der letzte wert vorne und nicht hinten hmm dann muss ich wohl schauen wie ich das ändern kann ich hoffe ihr könnt mir noch folgen

    WTF?
    Das ist a) gibberish und b) die Teile wo man erahnen kann was du meinst sind purer Unsinn.

    z.B.

    da in den klammer 1 << steht wird auch nah jeder schleife die binärzahl um eines verschoben

    Nein, nein, nein, nein!
    1 << 1 ist einfach ein Ausdruck, der den Wert 2 hat. Dabei wird *nichts* modifiziert, und es kommt auch bei jedem Schleifendurchlauf das selbe raus. Du könntest statt 1 << 1 genau so gut direkt 2 hinschreiben.

    ⚠
    Tippst du das vielleicht von jmd. ab und verwechselst dauernd 1 und i?



  • Aoki_san schrieb:

    Jap ich merke es auch gerade -.-
    Boa naja egal ist jetzt auch nicht mehr so wichtig

    Hihi.
    Dir ist schon klar dass ich dich und nicht SeppJ gemeint habe mit dem I.M.P.?



  • Ne ist ja jetzt eigtl auch egal ich denke in die falsche richtung was deshalb wollte ich fragen ob ihr es vllt auflösen könnt



  • hustbaer schrieb:

    Aoki_san schrieb:

    Jap ich merke es auch gerade -.-
    Boa naja egal ist jetzt auch nicht mehr so wichtig

    Hihi.
    Dir ist schon klar dass ich dich und nicht SeppJ gemeint habe mit dem I.M.P.?

    Schon klar


Anmelden zum Antworten