Bits umkehren

fastloop
2007-08-31
2007-09-03
  • fastloop - 2007-08-31

    Hallo,

    ich programmiere in Codesys, und jetzt ist es notwendig, bei einer 16bit INT Zahl die bits zu vertauschen.

    Also aus

    0000000011000111 soll

    1110001100000000 werden.

    Haben schon diverse Codeexamples aus C usw.. versucht auf Pascal umzuschreiben - ohne erfolg.

    Ich hoffe jemand hat eine lösung dafür parat, damit wäre mir sehr geholfen!

    Vielen Dank schon einmal im Voraus,

    mfg Florian

     
  • Benjamin - 2007-08-31

    Du willst nicht die Bits vertauschen, denn das würdest due mit XOR machen. Nein, was du willst ist High- und Lowbyte vertauschen das geht am einfachsten so.

    wInt := ROL(wInt, 8);
    
     
  • gravieren - 2007-08-31

    @Benjanin

    Zitat:
    Nein, was du willst ist High- und Lowbyte vertauschen das geht am einfachsten so.

    Nö, ich denke er will die Bits spiegeln.

    Ich würde sagen, ST starten.

    Schleife mit 16 Durchgängen starten.

    und die Bits swappen.

    Achtung Pseudocode ! ! !

    NICHT Lauffähig, nur grobalgo, der mir auf die schnelle einfällt.

    (C-Abwandlung )

    loop
    x=0
    y=15
    Temp
    for loop := 1, loop < 16, loop++
       Temp := bit[x]
       bit[x] := bit[y]
       bit[y] := Temp
       x := x+1
       y := y-1
    end_for
    
     
  • foenig - 2007-08-31

    Mal auf die schnelle:

    VAR
       original    : WORD;
       originalTmp : WORD;
       mirror      : WORD;
       mirrorTmp   : WORD;
       forCount : INT;
    END_VAR
    originalTmp := original;
    FOR forCount  := 0 TO 15 DO
       mirrorTmp.0 := originalTmp.0;
       mirror := mirrorTmp;
       mirrorTmp   := SHL(mirrorTmp  , 1);
       originalTmp := SHR(originalTmp, 1);
    END_FOR;
    
     
  • gravieren - 2007-08-31

    Hi Zotos

    Schaut FAST gut aus

    Frage:

    Zitat:
    mirror := mirrorTmp;

    Kapier ich nicht.

     
  • foenig - 2007-08-31

    Lustig das Du mich zotos nennst.

    Ich behaupte nicht das der Code elegant ist ;o)

    originalTmp := original; (* um das Original nicht zu verändern *)
    FOR forCount  := 0 TO 15 DO
       mirrorTmp.0 := originalTmp.0;
       mirror := mirrorTmp; (* es folgt ja noch links ein schieben  also kopiere das korrekte Ergebnis sichern *)
       mirrorTmp   := SHL(mirrorTmp  , 1);
       originalTmp := SHR(originalTmp, 1);
    END_FOR; 
    

    Alternativ kann man auch eine IF verwenden:

    originalTmp := original; (* um das Original nicht zu verändern *)
    FOR forCount  := 0 TO 15 DO
      mirror.0 := originalTmp.0;
      IF forCount <= 14 THEN
         mirror    := SHL(mirror  , 1);
         originalTmp := SHR(originalTmp, 1);
      END_IF;
    END_FOR; 
    

    PS: Nenne mich jetzt nicht Kai ich habe keine 3PDFs angehängt ;o)

     
  • Pitsch52 - 2007-09-01

    Hallo foenig

    Warum so komliziert? Wenn es nur darum geht die Bits zu spiegeln, kannst Du doch eine Funktion schreiben. Und zwar so:

    mirror.0 := original.15;

    mirror.1 := original.14;

    mirror.2 := original.13;

    usw.......

    mirror.15 := original.0;

    Der Code sieht somit viel verständlicher aus. Vielleicht nicht am professionellsten, aber funktioniert! Und ist garantiert schneller als mit all den Bit-Schiebefunktionen!😉

    Mit freundlichen Grüssen! Pitsch

     
  • foenig - 2007-09-01

    Pitsch52 hat geschrieben:
    Hallo foenig
    Warum so komliziert?
    ...

    Ist doch Geschmackssache. Ich habe schließlich nur eine Lösung gezeigt. Und selbst Dir war es zuviel mittels Copy Paste hier alle 16 Bits zu Swapen ;o)

     
  • Benjamin - 2007-09-03

    Ihr drei habt natürlich recht, ich hatte nur die einfachste Problemstellung vor Augen.

     

Log in to post a comment.