![]() |
Delphi-Version: 2010
RotateLeft: 32-Bit Integer rotieren
Hallöchen :)
Ich habe eine 32-Bit Integer und möchte diese bitweise rotieren. Eine Delphi-Methode hab ich jetzt nicht gefunden bin aber auf eine Assembler Anweisung gestoßen, das würde dann so aussehen:
Delphi-Quellcode:
zahl ist vom Typ UInt32 und bits vom Typ UInt8.
asm
rol zahl,bits end; Jetzt bekomm ich aber die Meldung: [DCC Fehler] E2107 Operandengröße stimmt nicht überein Hab für bits schon alle Typen von UIntX durchprobiert aber nix davon klappt. Leider find ich in der Hilfe nix dazu und sonst auch nur recht wenig bzw garnichts. Gibt es evtl eine RotateLeft Methode die ich übersehen habe? |
AW: RotateLeft: 32-Bit Integer rotieren
Hallo,
So gehts:
Delphi-Quellcode:
Oder so:
asm
mov cl, bits mov eax, zahl rol eax, cl mov zahl, eax end;
Delphi-Quellcode:
function rol(Zahl: Integer; Bits: Byte): Integer;
asm xchg cl,dl rol eax, cl end;
Delphi-Quellcode:
var zahl: UInt32;
bits: UInt8; begin Zahl := $80000000; bits := 1; Caption := IntToStr(rol(Zahl,bits)); end; |
AW: RotateLeft: 32-Bit Integer rotieren
Da bekomm ich jetzt zwei Meldungen:
Erste Zeile: [DCC Fehler] E2107 Operandengröße stimmt nicht überein zweite Zeile: [DCC Fehler] E2116 Ungültige Kombination von Opcode und Operanden Edit: Man muss dazu sagen, ich kenn mich null mit dem assambler zeugs aus, nur in der theorie bisher Edit: Der neue Ansatz geht auch nicht: Erste Zeile: [DCC Fehler] E2107 Operandengröße stimmt nicht überein |
AW: RotateLeft: 32-Bit Integer rotieren
Von Assembler hab ich auch keinen Plan, aber macht diese Funktion, was Du willst?
Delphi-Quellcode:
function RotateLeft(Zahl, Count: UInt32): UInt32;
begin Result := Zahl shr (SizeOf(Zahl) shl 3 - Count) or Zahl shl Count; end; |
AW: RotateLeft: 32-Bit Integer rotieren
Also bei mir geht:
Delphi-Quellcode:
ohne Probleme
function rol(Zahl: Integer; Bits: Byte): Integer;
asm xchg cl,dl rol eax, cl end; |
AW: RotateLeft: 32-Bit Integer rotieren
Also das von DeddyH scheint zu funktionieren, auch wenn ich nicht ganz verstehe was da der Reihe nach passiert, besonders den Part mit
Delphi-Quellcode:
SizeOf(Zahl) shl 3 - Count
Die rol-Methode von Neutral General geht auch, da versteh ich aber noch weniger :duck: |
AW: RotateLeft: 32-Bit Integer rotieren
Hallo,
Der erste Parameter der Funktion wird in eax/ax/al gespeichert, der Zweite in edx/dx/dl. D.h. Zahl = eax Bits = dl rol erfordert:
Delphi-Quellcode:
rol [register], cl
xchg tauscht die Werte von 2 8-Bit Registern. Also tausche ich den Wert von dl (Bits) mit cl und rolle dann eax (Zahl) mit cl (Bits). Das Ergebnis einer Funktion steht in eax. Also brauche ich nichts weiter zu machen.
Delphi-Quellcode:
function rol(Zahl: Integer; Bits: Byte): Integer;
asm // eax := Zahl; // dl := Bits; xchg cl,dl // cl := dl; rol eax, cl // Result := eax rol cl; end; |
AW: RotateLeft: 32-Bit Integer rotieren
Räspäckt! Danke! :thumb:
|
AW: RotateLeft: 32-Bit Integer rotieren
Und ich habe das SizeOf nur verwendet, falls man mal einen anderen Datentyp nehmen möchte. Beispiel mit einem Byte:
Code:
//204 um 3 Bits nach links rotieren
11001100 //SizeOf ist hier 1, das mal 8 (shl 3) ergibt 8 //davon die 3 abziehen, macht 5 11001100 shr 5 00000110 //Nun Zahl um 3 nach links verschieben 11001100 shl 3 01100000 //Nun noch beide verodern 01100000 or 00000110 ======== 01100110 |
AW: RotateLeft: 32-Bit Integer rotieren
ahhh also das drei nachn links ist wie wenn ich mit 8 multipliziere, also so würds auch gehen:
Delphi-Quellcode:
function RotateLeft(Zahl, Count: UInt32): UInt32;
begin //Result := Zahl shr (SizeOf(Zahl) shl 3 - Count) or Zahl shl Count; Result := Zahl shr (SizeOf(Zahl)*8 - Count) or Zahl shl Count; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz