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 "Variablenübergreifende" Bitverschiebungen (https://www.delphipraxis.net/133996-variablenuebergreifende-bitverschiebungen.html)

Neutral General 14. Mai 2009 20:50

Re: "Variablenübergreifende" Bitverschiebungen
 
Wie meinst du das?

Also die geshiftete Zahl soll schon noch zu gebrauchen sein danach^^

Dax 14. Mai 2009 20:52

Re: "Variablenübergreifende" Bitverschiebungen
 
Was hast du eigentlich vor? ;)

Wenn es um Arithmetik mit großen Zahlen geht und du dafür eine Library schreiben willst (weil du musst, nicht, weil dir einfach mal danach ist), wäre es vielleicht produktiver, ein Binding für GMP zu benutzen/schreiben.

Neutral General 14. Mai 2009 21:01

Re: "Variablenübergreifende" Bitverschiebungen
 
Hi,

Ja genau das habe ich vor :mrgreen:
Will das aber gerne mal selbst probieren. Bisher funktioniert es auch ganz gut.

Allerdings weiß ich noch nicht so genau wie ich die Division halbwegs effizient implementieren kann... :(
Das shiften klappt mittlerweile. Und ich denke auch ganz gut.

Blup 15. Mai 2009 10:10

Re: "Variablenübergreifende" Bitverschiebungen
 
Zitat:

Zitat von Neutral General
Zitat:

Zitat von Blup
Funktioniert für count = 0..7 [...]

Ah jo das bringt mir ja nix ;)
Habs aber jetzt wie oben beschrieben gelöst

Ganze Byte zu verschieben hab ich dir schon allein zugetraut. :zwinker:

Edit:
Delphi-Quellcode:
type
  TByteArray = packed array of Byte;

function Rol(const AValue, ACount: Byte): Byte register;
asm
  mov cl, dl
  rol al, cl
end;

function ArrayShl(const arr: TByteArray; count: integer): TByteArray;
var
  mask0, mask1, b0, b1: Byte;
  i: integer;
begin
  Result := Copy(arr);
  {Byte-Verschiebung}
  i := count div 8;
  if i > 0 then
  begin
    Move(Result[i], Result[0], SizeOf(Result[0]) * (Length(Result) - i));
    FillChar(Result[Length(Result) - i], SizeOf(Result[0]) * i, #0);
    count := count mod 8;
  end;
  {Bit-Verschiebung}
  mask0 := $FF shl Count;
  mask1 := mask0 xor $FF;
  b1 := 0;
  for i := High(Result) downto 0 do
  begin
    b0 := rol(Result[i], count);
    Result[i] := (b0 and mask0) or (b1 and mask1);
    b1 := b0;
  end;
end;

Neutral General 15. Mai 2009 13:40

Re: "Variablenübergreifende" Bitverschiebungen
 
Hi,

So habe ichs im Prinzip auch gemacht. Allerdings mit shl und shr, statt rol :mrgreen:
Wobei die Methode mit rol wahrscheinlich noch ein Stückchen schneller ist schätze ich.


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

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