Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Shifting funktioniert nicht


Schamese - Fr 20.06.08 21:15
Titel: Shifting funktioniert nicht
Hi, Community!

Ich habe eine Funktion geschreiben, mit der ich aus einem Int64 ein bestimmtes Byte herauskriegen möchte.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
function GetByte(value: Int64; byteNumber: Byte): Byte;
begin
  Write(IntToHex(value, 16) + '[' + IntToStr(byteNumber) + '] --> ');
  Result := (value shl (byteNumber * 8)) and $FF00000000000000;
  WriteLn(IntToHex(Result, 2));
end;


Aber sie funktioniert nicht.

Die Ausgabe für z.B.

Delphi-Quelltext
1:
2:
for i := 0 to 7 do
  bytes[i] := GetByte($A, i);
ist immer:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
000000000000000A[0] --> 00
000000000000000A[1] --> 00
000000000000000A[2] --> 00
000000000000000A[3] --> 00
000000000000000A[4] --> 00
000000000000000A[5] --> 00
000000000000000A[6] --> 00
000000000000000A[7] --> 00


Soll wäre ja:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
000000000000000A[0] --> 00
000000000000000A[1] --> 00
000000000000000A[2] --> 00
000000000000000A[3] --> 00
000000000000000A[4] --> 00
000000000000000A[5] --> 00
000000000000000A[6] --> 00
000000000000000A[7] --> 0A


Aber warum?

Gruß, Christian.


Moderiert von user profile iconNarses: Topic aus Windows API verschoben am So 22.06.2008 um 02:31


Sirke - Fr 20.06.08 21:19

Die Konstruktion finde ich sehr komisch, weil deine Maskierung kein Byte als Resultat hat! Versuchts mal mit:

Delphi-Quelltext
1:
Result := (value shr (8 * byteNumber)) and $FF;                    


Schamese - Fr 20.06.08 21:21

Shon besser. Aber jetzt kommt die Ausgabe immer 2 mal:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
000000000000000A[0] --> 0A
000000000000000A[1] --> 00
000000000000000A[2] --> 00
000000000000000A[3] --> 00
000000000000000A[4] --> 0A
000000000000000A[5] --> 00
000000000000000A[6] --> 00
000000000000000A[7] --> 00


Sirke - Fr 20.06.08 22:22

Sehr komisch :S ... bei mir ist das nämlich nicht der Fall? Versuche mal eine ander Zahl als Eingabe, z.B. $0123456789ABCDEF.


BenBE - Sa 21.06.08 00:01

SHL und SHR sind in älteren Delphi-Versionen nur für 32-Bit-Zugriffe implementiert; wenn man 64 Bit haben will, muss man das über einen PByte-Zeiger auf die Variable machen, den man mit wetwas Pointer-Arithmetik manipuliert ...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
function GetByte(value: Int64; byteNumber: Byte): Byte;
begin
  Write(IntToHex(value, 16) + '[' + IntToStr(byteNumber) + '] --> ');
  Result := PByte(Integer(PByte(@value)) + byteNumber)^;
  WriteLn(IntToHex(Result, 2));
end;


Martok - Sa 21.06.08 00:29

user profile iconBenBE hat folgendes geschrieben:
SHL und SHR sind in älteren Delphi-Versionen nur für 32-Bit-Zugriffe implementiert

Hast du zufällig nähere Infos wie alt? Das würde glaub ich ein Problem erklären was ich neulich hatte...


BenBE - Sa 21.06.08 12:06

user profile iconMartok hat folgendes geschrieben:
user profile iconBenBE hat folgendes geschrieben:
SHL und SHR sind in älteren Delphi-Versionen nur für 32-Bit-Zugriffe implementiert

Hast du zufällig nähere Infos wie alt? Das würde glaub ich ein Problem erklären was ich neulich hatte...

Also zumindest für D7 sind's noch 32 Bit, für neuere Versionen hab ich's noch nicht getestet.