AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Unterschiedliches Verhalten bei Bitverschiebung (C# / Delphi

Unterschiedliches Verhalten bei Bitverschiebung (C# / Delphi

Ein Thema von WorstNightmare · begonnen am 21. Jun 2009 · letzter Beitrag vom 21. Jun 2009
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.102 Beiträge
 
Delphi 12 Athens
 
#11

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De

  Alt 21. Jun 2009, 15:45
@arithmetic_shr

und das geht?
da frag ich mich, was ich da grad oben nachedieirt hab
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#12

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De

  Alt 21. Jun 2009, 16:09
Zitat von himitsu:
@arithmetic_shr

und das geht?
da frag ich mich, was ich da grad oben nachedieirt hab
Keine Ahnung, aber es könnte klappen

Bei -1024 shr 11 soll -1 rauskommen.

Meine Funktion rechnet also:

sign(-1024) * (abs(-1024) shr 11)
= -1 * (1024 shr 11)
= -1 * 1
= -1
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#13

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De

  Alt 21. Jun 2009, 16:17
1024 shr 11 ist aber 0.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
WorstNightmare

Registriert seit: 6. Okt 2008
159 Beiträge
 
RAD-Studio 2010 Arc
 
#14

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De

  Alt 21. Jun 2009, 16:21
Alsoo mal im Überblick:
arithmetic_shr (jfheins) ergibt immer 0; bei einigen Werten muss man -7 rechnen, dann stimmt die Zahl mit C# überein
ArithmeticShiftRight (asm) kompiliert nicht (Operandengröße stimmt nicht)
ArithmeticShiftRight (delphi) scheint zu funktionieren, da muss ich nochmal kucken, ich glaube bei anderen Werten geht sie nicht...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.102 Beiträge
 
Delphi 12 Athens
 
#15

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De

  Alt 21. Jun 2009, 16:25
ich muß zugeben, wir beide rechnen irgendwie wohl nicht so ganz richtig

Delphi-Quellcode:
Function ArithmeticShiftRight(i: Integer; Shift: Byte): Integer;
  ASM
    MOV CL, DL
    SAR EAX, CL
  End;

Function ArithmeticShiftRight2(i: Integer; Shift: Byte): Integer;
  Begin
    Result := (i shr Shift) or (($FFFFFFFF * (i shr 31)) shl 32 - Shift)
  End;

function arithmetic_shr(a: Integer; b: Byte): Integer;
begin
  Result := Sign(a) * (abs(a) shr b);
end;

procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin
  for i := -1024 to 1024 do
    Memo1.Lines.Add(Format('%d: %d %d %d', [i,
      ArithmeticShiftRight (i, 11),
      ArithmeticShiftRight2(i, 11),
      arithmetic_shr (i, 11)
    ]));
end;
zumindestens rechnen alle etwas anders (auch mal mit "i sar 8" probiert und da sieht es noch schlimmer aus)

[add]
wegen der Operandengröße ... siehe 1. Funktion
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
WorstNightmare

Registriert seit: 6. Okt 2008
159 Beiträge
 
RAD-Studio 2010 Arc
 
#16

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De

  Alt 21. Jun 2009, 16:29
Juhu, mit der neuen ASM-Funktion geht es einwandfrei. Alle Werte sind korrekt. Dankeschön.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.102 Beiträge
 
Delphi 12 Athens
 
#17

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De

  Alt 21. Jun 2009, 16:36
Delphi-Quellcode:
Function ArithmeticShiftRight2(i: Integer; Shift: Byte): Integer;
  Begin
    Result := (i shr Shift) or ((LongWord($FFFFFFFF) * LongWord(i shr 31)) shl (32 - Shift));
  End;
Das rechnet jetzt auch korekt (hatte beim letzen SHL eine Klammer vergessen und die Multiplikation nun ohne Vorzeichen rechnen lassen)

PS: @Apollonius: im positiven Bereich rechnet deines schon irgendwie richtig,
nur nicht mit negativen i bzw. a
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#18

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De

  Alt 21. Jun 2009, 16:39
Ich war's nicht. Ehrenwort.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.102 Beiträge
 
Delphi 12 Athens
 
#19

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De

  Alt 21. Jun 2009, 16:41
jfheins meinte ich
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#20

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De

  Alt 21. Jun 2009, 16:43
Du meinst sicher mich

Ja - das Problem ist: x shr n ist ja wie eine Division x / 2^n die nach unten abgerundet wird (richtung -Unenedlich).

d.h. bei 1024 shr 11 shift kommt 0,5 raus und das wird auf 0 gerundet. (-0,5 würde auf das richtige Ergebnis -1 gerundet werden)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz