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
Narses: 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
BenBE 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
Martok hat folgendes geschrieben: |
BenBE 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!