"Logischer Ausdruck": Was macht der hier?



  • Hi,

    in einer Klausur war folgender Code gegeben, und man sollte dazu schreiben, welcher "logische Wert von x" da berechnet wird:

    x = ((x & 0xff00) << 8) | ((x & 0xff0000) >> 8)
    

    Dabei ist << das logische shift-left und >> das arithmetische shift-right. Ich weiß, was der Code macht, aber am Sinn dahinter bin ich elegant gescheitert. Keine Ahnung, welchen "logischen Wert von x" ich da angeblich berechne. Da ich die Aufgabe also nicht ganz lösen konnte, interessiert mich das umso mehr ...

    Hat vlt. jemand eine Idee?



  • Das sieht mir nach einem Swap aus. Ob man damit einen logischen Ausdruck erzeugen kann? Kommt wohl auf die Interpretation der Zahl an. Wenn 0x0100 true ist und 0x0010 false ist...

    Vielleicht haben die sich mit "logischer Ausdruck" nur verschieben, und du solltest nur angeben was der Code tut...

    MfG SideWinder



  • Solltest Du evtl. angeben, inwieweit x durch diesen Ausdruck manipuliert wird? Ein "logischer Ausdruck" im Sinne von boolsch ist das jedenfalls nicht.

    Der Ausdruck vertauscht das zweite und dritte Byte (vom niederwertigsten an gezählt) von x.



  • tauscht die inneren beiden Bytes und nullt die anderen (wenn x 4 Bytes hat)

    0x12AABB34 => 0x00BBAA00



  • Hi,

    LordJaxom schrieb:

    Der Ausdruck vertauscht das zweite und dritte Byte (vom niederwertigsten an gezählt) von x.

    genau das habe ich auch beschrieben. Aber es war wirklich wortwörtlich die Frage gestellt: "Welchen logischen Wert von X berechnet die Funktion?", und damit konnte ich nicht wirklich etwas anfangen bzw. hielt es für unsinnig. Unter "logischem Wert" hätte ich mir so etwas vorgestellt wie "not x" oder ~x.

    Allerdings war der Code ursprünglich in Assembler gegeben. Das da oben ist schon meine Übersetzung nach Java. Im Original sah es so aus:

    mov 8(%epb), %eax
    mov %eax,    %edx
    
    and 0xff00, %eax
    shl 0x8,    %eax
    
    and 0xff0000, %edx
    sar 0x8,      %edx
    
    or %edx, %eax
    ret
    

    Sollte doch stimmen, oder?

    Ich schätze mal, die Aufgabe war einfach dämlich formuliert?

    @SideWinder
    Ich hatte zunächst an so etwas wie Little-Endian <-> Big Endian gedacht. Aber das war natürlich Murks, weil das unterste und das oberste Byte nicht angetastet werden. Bzw. durch den Arithmetischen Right-Shift habe ich doch sogar völligen Murks, wenn die Zahl im Komplement dargestellt wird, oder nicht? Dann ist es ja nicht einmal mehr ein Swap ...

    @rüdiger
    Genau das ist die Antwort, die ich hingeschrieben habe. Nur der Sinn vom arithemtischen shift-right erschließt sich mir immer noch nicht 😕


Anmelden zum Antworten