Varianten des Schiebens



  • Hallo,

    momentan beschäftige ich mit dem verschieben von Bits, unter C++ sollte es der << bzw. >> Operator sein. Insgesamt habe ich nun drei Arten von schieben gefunden, bin mir aber noch nicht so ganz sicher bei der Bedeutung.

    • bitweise schieben: Beim bitweisen schieben werden Nullen nachgeschoben. Diese können von links bzw. rechts nachgeschoben werden.
    • logisches schieben: Hier werden einfach nur Nullen angehangen
    • arithmetisches schieben: ist wir das bitweise schieben, allerdings mit Rücksichtnahme auf das Vorzeichen

    Dieses sind die Informationen die ich mit Hilfe der Google-Buchsuche, google und einigen Standardwerken herausbekommen habe. Kann mir jemand von euch sagen, ob dieses so stimmt oder ich besser noch einmal neu Suche?

    Viele grüße
    MM



  • Es gibt nur zwei Arten, logisches und arithmetisches Schieben. Bitweise arbeiten die beide, da werden ja Bits verschoben.



  • ^^'logisches schieben' und 'bitweises schieben' sind wohl dasselbe, sonst stimmts so ungefähr. ausser das mit dem anhängen, also durch schieben werden die bits nicht mehr.
    🙂



  • "foo << x" schiebt die Bits in foo um x Stellen nach Links. d.h. rechts wird mit Nullen nachgefuellt, und links fallen x Bits einfach "raus".

    "foo >> x" macht das gleiche in die andere Richtung.

    Mehr gibts in C++ nicht. Die Shifts operieren immer auf Bitebene, d.h. etwaige Vorzeichen werden komplett ignoriert.



  • Blue-Tiger schrieb:

    Mehr gibts in C++ nicht. Die Shifts operieren immer auf Bitebene, d.h. etwaige Vorzeichen werden komplett ignoriert.

    ein rechts-shift könnte einsen reinschieben, wenn der wert negativ ist. ist jedenfalls in C (ohne ++) so.
    🙂



  • ;fricky schrieb:

    Blue-Tiger schrieb:

    Mehr gibts in C++ nicht. Die Shifts operieren immer auf Bitebene, d.h. etwaige Vorzeichen werden komplett ignoriert.

    ein rechts-shift könnte einsen reinschieben, wenn der wert negativ ist. ist jedenfalls in C (ohne ++) so.
    🙂

    hmm... hoppla, ja da koenntest Recht haben 🤡



  • Hey,

    vielen Dank für die antworten. In der Literatur habe ich bis jetzt immer positives shiften gefunden, ein Bespiel:

    2 << 4
    

    wäre 32. Was passiert bei

    2 << -4
    

    ? Diesen Fall habe ich bis jetzt noch nicht gefunden 😞

    Viele Grüße
    MM



  • ^^was meinste wohl? probiers aus. auch das: -2 >> 1
    🙂



  • MrMilk schrieb:

    Hey,

    vielen Dank für die antworten. In der Literatur habe ich bis jetzt immer positives shiften gefunden, ein Bespiel:

    2 << 4
    

    wäre 32. Was passiert bei

    2 << -4
    

    ? Diesen Fall habe ich bis jetzt noch nicht gefunden 😞

    Viele Grüße
    MM

    Sowas macht man auch einfach nicht. Shifts nur mit positiven Zahlen!



  • ;fricky schrieb:

    ein rechts-shift könnte einsen reinschieben, wenn der wert negativ ist. ist jedenfalls in C (ohne ++) so.
    🙂

    Es ist in C mit und ohne ++ gleich, nämlich implementation-defined.

    (Und x << -1 ist undefined.)



  • Bashar schrieb:

    (Und x << -1 ist undefined.)

    'ne negative konstante als shift-count meckertn compiler, für gewöhnlich, sofort an.
    🙂



  • Genau das gleiche habe ich auch heraus gefunden 🙂

    Also zusammengefasst:

    arithmetisches Schieben:
    Das Vorzeichen wird bei schieben berücksichtigt. Wird von rechts nach links geschoben kommen Nullen nach. Bei schieben von links nach rechts kommen Einsen, wenn die Zahl negativ ist, ansonsten Nullen.

    logisches schieben:
    Hier wird das Vorzeichen nicht beachtet. Somit wird bei beiden Schieberichtungen immer Nullen nachgeschoben.

    Wäre dieses so richtig?

    viele Grüße
    MM

    Oh und noch ein Nachtrag: Innerhalb der Sprache C++ ist bei einem negativen Shift dem Compiler überlassen, wie er dieses löst.



  • Interessant wäre zu wissen wie arithmetisches shiften auf Systemen mit z.B. sign+magnitude-Darstellung aussieht :p



  • Tim schrieb:

    Interessant wäre zu wissen wie arithmetisches shiften auf Systemen mit z.B. sign+magnitude-Darstellung aussieht

    das sign-bit stehen lassen und alle anderen shiften. wie sonst?
    🙂



  • Gerade habe ich noch eine weitere Quelle zu diesem Thema entdeckt. In dem Buch "Programmieren in C" von Brain W. Kernigham und Dennis M. Ritchie ist es dies auch noch einmal genau beschrieben 🙂 (Seite 200 und 48)

    viele Grüße
    MM


Log in to reply