![]() |
Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
@arithmetic_shr
und das geht? da frag ich mich, was ich da grad oben nachedieirt hab :oops: |
Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
Zitat:
Bei -1024 shr 11 soll -1 rauskommen. Meine Funktion rechnet also: sign(-1024) * (abs(-1024) shr 11) = -1 * (1024 shr 11) = -1 * 1 = -1 |
Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
1024 shr 11 ist aber 0.
|
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... |
Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
ich muß zugeben, wir beide rechnen irgendwie wohl nicht so ganz richtig :oops:
Delphi-Quellcode:
zumindestens rechnen alle etwas anders (auch mal mit "i sar 8" probiert und da sieht es noch schlimmer aus)
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; [add] wegen der Operandengröße ... siehe 1. Funktion :angel: |
Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
Juhu, mit der neuen ASM-Funktion geht es einwandfrei. Alle Werte sind korrekt. Dankeschön. :dp:
|
Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
Delphi-Quellcode:
Das rechnet jetzt auch korekt (hatte beim letzen SHL eine Klammer vergessen und die Multiplikation nun ohne Vorzeichen rechnen lassen)
Function ArithmeticShiftRight2(i: Integer; Shift: Byte): Integer;
Begin Result := (i shr Shift) or ((LongWord($FFFFFFFF) * LongWord(i shr 31)) shl (32 - Shift)); End; PS: @Apollonius: im positiven Bereich rechnet deines schon irgendwie richtig, nur nicht mit negativen i bzw. a |
Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
Ich war's nicht. Ehrenwort. :mrgreen:
|
Re: Unterschiedliches Verhalten bei Bitverschiebung (C# / De
jfheins meinte ich :oops:
|
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. |
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