Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Unterschiedliches Verhalten bei Bitverschiebung (C# / Delphi (https://www.delphipraxis.net/135975-unterschiedliches-verhalten-bei-bitverschiebung-c-delphi.html)

himitsu 21. Jun 2009 14:45

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
 
@arithmetic_shr

und das geht?
da frag ich mich, was ich da grad oben nachedieirt hab :oops:

jfheins 21. Jun 2009 15:09

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
 
Zitat:

Zitat von himitsu
@arithmetic_shr

und das geht?
da frag ich mich, was ich da grad oben nachedieirt hab :oops:

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

Apollonius 21. Jun 2009 15:17

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
 
1024 shr 11 ist aber 0.

WorstNightmare 21. Jun 2009 15:21

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
 
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...

himitsu 21. Jun 2009 15:25

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
 
ich muß zugeben, wir beide rechnen irgendwie wohl nicht so ganz richtig :oops:

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

WorstNightmare 21. Jun 2009 15:29

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
 
Juhu, mit der neuen ASM-Funktion geht es einwandfrei. Alle Werte sind korrekt. Dankeschön. :dp:

himitsu 21. Jun 2009 15:36

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
 
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

Apollonius 21. Jun 2009 15:39

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
 
Ich war's nicht. Ehrenwort. :mrgreen:

himitsu 21. Jun 2009 15:41

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
 
jfheins meinte ich :oops:

jfheins 21. Jun 2009 15:43

Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
 
Du meinst sicher mich :stupid:

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)


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:53 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz