Autor |
Beitrag |
rcracer
Hält's aus hier
Beiträge: 4
|
Verfasst: Mo 15.09.08 20:37
Hallo Leute,
ich hab folgende Funktion aus dem Internet für C
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| unsigned find_fast(unsigned u) { unsigned a, b, r; u += 0xe91aaa35; u ^= u >> 16; u += u << 8; u ^= u >> 4; b = (u >> 8) & 0x1ff; a = (u + (u << 2)) >> 19; r = a ^ hash_adjust[b]; return r; } |
Diese habe ich mit einem C2Pascal Editor zu diesem gemacht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| function find_fast(u: Word): Word; var a, b, r: Word; begin
u:= u + $e91aaa35; u:= u xor u shr 16; u:= u + u shl 8; u:= u xor u shr 4; b := (u shr 8) and $1ff; a := (u + (u shl 2)) shr 19; r := a ^ hash_adjust[b]; result:= r; end; |
Jedoch funktioniert
Delphi-Quelltext 1:
| r := a ^ hash_adjust[b]; |
nicht.(Fehlermeldung beim Compilieren)
(hash_adjust[] ist vom Typ Word)
Ich verstehe leider auch nicht, was ^ in diesem Fall macht.
Ich höffe es findet sich jemand hier, der auch mit C etwas erfahrung hat. Danke
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mo 15.09.08 20:40
In diesem Zusammenhang würde ich das ^ aus dem C-Code mit XOR nach Delphi übersetzen - so wie es an den anderen Stellen auch gemacht wurde. 
_________________ We are, we were and will not be.
Zuletzt bearbeitet von Gausi am Mo 15.09.08 20:41, insgesamt 1-mal bearbeitet
|
|
Fighter#1
      
Beiträge: 787
Win XP, Ubuntu 8.04
Turbo Delphi 2006, Delphi 2005 Pe, Delphi 5 Pe, Netbeans 6.1, Eclipse, Microsoft VisualC#, Dev C++, PHP, HTML, CSS
|
Verfasst: Mo 15.09.08 20:41
Afaik ist in C ^ <-- Dieses Zeichen das selbe wie XOR in Delphi
(Du hast es oben doch schon so implementiert(?))
Delphi-Quelltext 1:
| r := a xor hash_adjust[b]; |
so soltle die letzte Zeile sein
_________________ Wer andere beherrscht ist stark,
wer sich selbst beherrscht ist mächtig. Lao Tse
|
|
nagel
      
Beiträge: 708
Win7, Ubuntu 10.10
|
Verfasst: Mo 15.09.08 20:41
Hab zwar wenig Ahnung von C, müsste aber XOR sein.
... verdammt, zu langsam 
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 15.09.08 21:33
Und jetzt noch mal die Bestätigung von jemandem, der häufiger C programmiert:
Ja, der Operator ^ steht für xor.
Edit: Ach ja, kurze Anmerkung:
rcracer hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| function find_fast(u: Word): Word; var a, b, r: Word; begin
u:= u + $e91aaa35; u:= u xor u shr 16; u:= u + u shl 8; u:= u xor u shr 4; b := (u shr 8) and $1ff; a := (u + (u shl 2)) shr 19; r := a ^ hash_adjust[b]; result:= r; end; |
|
Du solltest zwingend darauf achten, dass Du bei der Übersetzung der Kurz-Operatoren Klammern setzt, wenn rechts ein Ausdruck steht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| function find_fast(u: Word): Word; var a, b, r: Word; begin
u:= u + $e91aaa35; u:= u xor (u shr 16); u:= u + u shl 8; u:= u xor (u shr 4); b := (u shr 8) and $1ff; a := (u + (u shl 2)) shr 19; r := a ^ hash_adjust[b]; result:= r; end; |
C und Delphi haben teilweise komplett unterschiedliche Klammerungsregeln, gerade was die Bitoperatoren und Addition\Subtraktion angeht.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|