Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - C zu Delphi (Wer kennt dieses Zeichen ^ in C )


rcracer - Mo 15.09.08 20:37
Titel: C zu Delphi (Wer kennt dieses Zeichen ^ in C )
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 8and $1ff;
    a  := (u + (u shl 2)) shr 19;
    r  := a ^ hash_adjust[b]; //???????wie in Pascal?????
    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 - 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. ;-)


Fighter#1 - 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


nagel - Mo 15.09.08 20:41

Hab zwar wenig Ahnung von C, müsste aber XOR sein.


... verdammt, zu langsam ;)


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


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:

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.