AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

RotateLeft: 32-Bit Integer rotieren

Ein Thema von Angel4585 · begonnen am 17. Aug 2011 · letzter Beitrag vom 17. Aug 2011
Antwort Antwort
Seite 1 von 2  1 2      
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#1

RotateLeft: 32-Bit Integer rotieren

  Alt 17. Aug 2011, 10:32
Delphi-Version: 2010
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?
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: RotateLeft: 32-Bit Integer rotieren

  Alt 17. Aug 2011, 10:34
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;
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (17. Aug 2011 um 10:43 Uhr)
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#3

AW: RotateLeft: 32-Bit Integer rotieren

  Alt 17. Aug 2011, 10:36
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
Martin Weber
Ich bin ein Rüsselmops

Geändert von Angel4585 (17. Aug 2011 um 10:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#4

AW: RotateLeft: 32-Bit Integer rotieren

  Alt 17. Aug 2011, 10:42
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: RotateLeft: 32-Bit Integer rotieren

  Alt 17. Aug 2011, 10:46
Also bei mir geht:
Delphi-Quellcode:
function rol(Zahl: Integer; Bits: Byte): Integer;
asm
  xchg cl,dl
  rol eax, cl
end;
ohne Probleme
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#6

AW: RotateLeft: 32-Bit Integer rotieren

  Alt 17. Aug 2011, 10:54
Also das von DeddyH scheint zu funktionieren, auch wenn ich nicht ganz verstehe was da der Reihe nach passiert, besonders den Part mit
SizeOf(Zahl) shl 3 - Count
Die rol-Methode von Neutral General geht auch, da versteh ich aber noch weniger
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: RotateLeft: 32-Bit Integer rotieren

  Alt 17. Aug 2011, 11:02
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:
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;
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (17. Aug 2011 um 11:04 Uhr)
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#8

AW: RotateLeft: 32-Bit Integer rotieren

  Alt 17. Aug 2011, 11:23
Räspäckt! Danke!
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#9

AW: RotateLeft: 32-Bit Integer rotieren

  Alt 17. Aug 2011, 11:28
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
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (17. Aug 2011 um 15:44 Uhr) Grund: Fehlerhaftes shr in shl korrigiert
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#10

AW: RotateLeft: 32-Bit Integer rotieren

  Alt 17. Aug 2011, 11:34
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;
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:54 Uhr.
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