Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   RotateLeft: 32-Bit Integer rotieren (https://www.delphipraxis.net/162315-rotateleft-32-bit-integer-rotieren.html)

Angel4585 17. Aug 2011 09:32

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:
asm
  rol zahl,bits
end;
zahl ist vom Typ UInt32 und bits vom Typ UInt8.
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?

Neutral General 17. Aug 2011 09:34

AW: RotateLeft: 32-Bit Integer rotieren
 
Hallo,

So gehts:
Delphi-Quellcode:
asm
  mov cl, bits
  mov eax, zahl
  rol eax, cl
  mov zahl, eax
end;
Oder so:
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;

Angel4585 17. Aug 2011 09:36

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

DeddyH 17. Aug 2011 09:42

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;

Neutral General 17. Aug 2011 09:46

AW: RotateLeft: 32-Bit Integer rotieren
 
Also bei mir geht:
Delphi-Quellcode:
function rol(Zahl: Integer; Bits: Byte): Integer;
asm
  xchg cl,dl
  rol eax, cl
end;
ohne Probleme

Angel4585 17. Aug 2011 09:54

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:

Neutral General 17. Aug 2011 10:02

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;

Angel4585 17. Aug 2011 10:23

AW: RotateLeft: 32-Bit Integer rotieren
 
Räspäckt! Danke! :thumb:

DeddyH 17. Aug 2011 10:28

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

Angel4585 17. Aug 2011 10:34

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 13:08 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz