rotate right/left in C

  • ich muss nen rotate left bzw. right in C machen...


    ich weiß nicht wieso das hier nicht funktioniert:



    es sollte also starten mit 11111111, erst auf 11111110 setzen
    und dann die 0 verschieben...


    111111101 dann 11111011 etc


    bis am ende soweit geschoben ist das wieder 11111111 ist und wieder auf 11111110 setzt..
    dann fängt er wieder von vorne an


    bei mir bleibt er einfach bei 11111110 stehen

  • Ganz doof geraten, C is nicht meins, aber ist "=" sowohl Zuweisungs- als auch Vergleichsoperator?
    Auch wird mir die Rekursion nicht so wirklich klar, wann soll er denn aus der while Schleife überhaupt irgendwann mal aussteigen?


    Sorry, dass ich nicht hilfreich sein kann, sage nur was mir so spontan einfällt.

    Postfächer laufen über. Lange Wartezeiten!

  • Als weiteren Tipp.


    1. Du hast keine Abbruchbedingung.
    2. Du kannst statt:


    P1 = P1<<1; auch P1 <<= 1;
    P1 = P1+1; auch P1++; oder P1 += 1;


    Sonst sieht es etwas nach Basic aus.

    Selig sind, die da geistlich arm sind; denn das Himmelreich ist ihr. (Psalm 51.19) (Jesaja 57.15)
    Ich freue mich, wenn die Stunde des Tages gekommen ist, wo ich mich hinsetze.. alles vergessen habe.. und über dich lachen kann. :-)

  • Zitat von smizz;359638

    Dann ist aber das gesamte if-then-else Konstrukt überflüssig.


    Edit: Naja, gut, kommt drauf an, trotzdem abstrus ^^


    War vielleicht nur ne Übung und dann ist es ok, ansonsten kann man die Schleife zu nichts gebrauchen.

    Selig sind, die da geistlich arm sind; denn das Himmelreich ist ihr. (Psalm 51.19) (Jesaja 57.15)
    Ich freue mich, wenn die Stunde des Tages gekommen ist, wo ich mich hinsetze.. alles vergessen habe.. und über dich lachen kann. :-)

  • Zumindest nicht, wenn P1 so definiert wird.
    Falls P1 das Ergebnis aus einer anderen Rechnung ist, dann wärs ok, aber da gäbs dann elegantere Wege als ein Endlosloop mit einer Abfrage drin.

    Postfächer laufen über. Lange Wartezeiten!

  • was irgendwo ein wenig komisch ist, dass du zwar nach links shiftest, aber danach per addition auffüllst.


    Entweder solltest du performanceorientiert arbeiten, dann würde man mit OR(1) auffüllen, sprich aus P1=P1|1; oder aber du willst einfach operieren, dann kannst du die shiftleft operation durch ne multiplikation mit 2 ersetzen, also P1*=2;


    Was die Zuweisung im if-Konstrukt angeht, dazu muss ich denk ich mal nix mehr sagen.
    Und zu der Endlosloop auch nicht.


    Kleiner Tipp noch am rande, leg die ein Stylesheet zu, dann ist dein code besser lesbar.
    Abgesehen davon, dass styles wie while(1) { zwar bei Java gang und gäbe sind, bei C aber als schlechter stil gelten, benötigst du auch bei if/else/while konstrukten keine scope-klammern, wenn die anweisung nur ein statement enthält. Als Stylesheet Tipp würde ich dir Lint von Google empfehlen. Das ist zwar recht strikt, aber man gewöhnt sich dran, und wenn man es dann irgendwann beherrscht, sieht der Code auch schon viel lesbarer aus.


    btw, hier eine version die funktionieren würde:


    Code
    1. unsigned char p1=255;
    2. while(p1)
    3. if(p1==255)
    4. p1^1;
    5. else
    6. p1=(p1<<1)|1;


    Selbstverständlich resultiert auch dies in einer Endlosschleife, da p1 niemals 0 wird. die Schleifenbedingung kannst du ja abändern, wenns du von endlosschleifen genug hast.