Verhalten des bitshift (<<,>>) Operators



  • Hallo allerseits,

    wie ist folgendes Verhalten des bitshift Operators zu erklären:

    a) unter Matlab ergibt (-7<<1) --> -14, alles klar
    b) unter C++ ergibt (-7<<1) --> -14, alles klar
    c) unter Matlab ergibt (-7>>1) --> -3, alles klar
    d) unter C++ ergibt (-7>>1) --> -4, warum das?

    Kann mir das jemand erklären? Ich weiß, dass das hier ein C++ Forum ist und meine Frage nicht direkt was mit den Eigenschaften von C++ zu tun. Wusste aber nicht, wo das ganze sonst rein sollte. Man möge mir das verzeihen.

    Viele Grüße,
    mbu



  • -7 >> 1 gibts in Matlab nicht, meinst du bitshift(-7, -1)? Dazu die Hilfe:

    C = BITSHIFT(A,K) returns the value of A shifted by K bits. A must be
    an unsigned integer or an array of unsigned integers.

    Matlabs Verhalten würde ich nicht als Maßstab heranziehen.

    In C++ ist das Rechtsschieben von negativen Werten implementation-defined. Die wesentliche Frage dabei ist, ob beim Rechtsschieben negativer Zahlen von links Nullen oder Einsen hereingeschoben werden, also ob das Schieben logisch oder arithmetisch ist. Der Standard schreibt es nicht vor.



  • Ja, ich im Matlab Fall meinte ich bitshift(-7,-1). Ich hab den Hilfeeintrag da auch gelesen, hab mich nur gewundert, dass dann bei Nutzung von -7 keine Fehlermeldung oder eigenartige Ergebnisse rauskommen.

    Was den C/C++ Fall betrifft, muss ich dann wohl auf den Bitshift bei negativen Werten verzichten. Irgendwie scheint mir -7>>1=-4 nämlich nicht wirklich logisch.



  • Mal der Einfachheit halber mit 8 Bit Wortbreite dargestellt: -7 ist in binär 11111001, das um 1 nach rechts geshiftet unter Beibehaltung des Vorzeichens: 11111100, dezimal -4. Bei einem logischen Shift wäre 01111100 herausgekommen, also 124. Bei der üblichen Zweierkomplementdarstellung kann man gar nicht auf -3 kommen.



  • Ja, da hast Du natürlich vollkommen Recht. Danke Dir nochmal.


Log in to reply