Autor Beitrag
rcracer
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mo 15.09.08 20:37 
Hallo Leute,

ich hab folgende Funktion aus dem Internet für C

ausblenden 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:

ausblenden 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 8and $1ff;
    a  := (u + (u shl 2)) shr 19;
    r  := a ^ hash_adjust[b]; //???????wie in Pascal?????
    result:= r;
end;



Jedoch funktioniert
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
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
BeitragVerfasst: 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(?))
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 708

Win7, Ubuntu 10.10

BeitragVerfasst: Mo 15.09.08 20:41 
Hab zwar wenig Ahnung von C, müsste aber XOR sein.


... verdammt, zu langsam ;)
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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:

user profile iconrcracer hat folgendes geschrieben:

ausblenden 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 8and $1ff;
    a  := (u + (u shl 2)) shr 19;
    r  := a ^ hash_adjust[b]; //???????wie in Pascal?????
    result:= r;
end;



Du solltest zwingend darauf achten, dass Du bei der Übersetzung der Kurz-Operatoren Klammern setzt, wenn rechts ein Ausdruck steht:
ausblenden 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 8and $1ff;
    a  := (u + (u shl 2)) shr 19;
    r  := a ^ hash_adjust[b]; //???????wie in Pascal?????
    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.