AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi "Variablenübergreifende" Bitverschiebungen
Thema durchsuchen
Ansicht
Themen-Optionen

"Variablenübergreifende" Bitverschiebungen

Ein Thema von Neutral General · begonnen am 13. Mai 2009 · letzter Beitrag vom 15. Mai 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

"Variablenübergreifende" Bitverschiebungen

  Alt 13. Mai 2009, 17:33
Hi,

Habt ihr eine Idee wie man möglichst effizient eine (ich nenne es mal) "variablenübergreifende" Bitverschiebung durchführen kann?
Wie ich mir das vorgestellt habe:

Delphi-Quellcode:
var arr: Array[0..1] of Byte = (00000000,10000000); // binär
begin
  arr := arr shl 1;
  // =>
  // arr = (00000001,00000000);
end;
Das ist jetzt natürlich nur Pseudocode. Es kann vorausgesetzt werden, dass die Werte im Speicher hintereinander stehen.

Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: "Variablenübergreifende" Bitverschiebungen

  Alt 13. Mai 2009, 17:51
Delphi-Quellcode:
function ArrayShl(arr: array of byte; count: integer): array of byte;
var i, offset: integer;
begin
  offset := count div (8 * sizeof(arr[0]));
  count := count mod (8 * sizeof(arr[0]));
  SetLength(result, arr - offset);
  for i := 0 to high(result) - 1 do
    result[i] := (arr[i + offset] shl count) or (arr[i + offset + 1] shr (8 * sizeof(arr[0]) - count));
  result[high(result)] := arr[high(arr)] shl count;
end;
Nicht getestet, aber sollte so gehen. Glaub ich
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#3

Re: "Variablenübergreifende" Bitverschiebungen

  Alt 13. Mai 2009, 17:51
naja da es nur "bytes" sind gehts
interpretiere das array als ein Word und shifte in dem.

Delphi-Quellcode:
var arr: Array[0..1] of Byte = (00000000,10000000); // binär
w:Word;
begin
// arr := arr shl 1;
  // =>
  // arr = (00000001,00000000);
 @w := @arr[0] ; // oder 1 ???
w := w shl 8;

end;
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: "Variablenübergreifende" Bitverschiebungen

  Alt 13. Mai 2009, 18:06
Zitat von Corpsman:
naja da es nur "bytes" sind gehts
interpretiere das array als ein Word und shifte in dem.

Delphi-Quellcode:
var arr: Array[0..1] of Byte = (00000000,10000000); // binär
w:Word;
begin
// arr := arr shl 1;
  // =>
  // arr = (00000001,00000000);
 @w := @arr[0] ; // oder 1 ???
w := w shl 8;

end;
Hi,

Ja das Problem wäre in meinem Fall aber, dass es quasi auch vorkommen kann, dass ich um 10, 20 oder 60 Bit verschiebe. Dann funktioniert das da nicht mehr.

@Dax: Ich schau mir deine Funktion mal an.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#5

Re: "Variablenübergreifende" Bitverschiebungen

  Alt 13. Mai 2009, 19:34
Mein Vorschlag diente eigentlich auch mehr der Abschreckung.

Ich empfehle dringend das so wie Dax zu machen. Wenn du natürlich um nicht 2^x ,x>=3 blöcke verschieben willst wird das ganze aufwendiger.

Wies auf jedenfall geht ist wenn du als zwischenschritt in ein Array of Boolean schreibst da drin dann schiebst und dann wieder zurück, wäre natürlich aber auch nicht so "schön"

evtl gibts aber auch ne "Move Speicher Funktion"
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#6

Re: "Variablenübergreifende" Bitverschiebungen

  Alt 13. Mai 2009, 20:38
Zitat von Neutral General:
Ja das Problem wäre in meinem Fall aber, dass es quasi auch vorkommen kann, dass ich um 10, 20 oder 60 Bit verschiebe. Dann funktioniert das da nicht mehr.
...
Hallo,

null problemo: du shiftest zuerst um BitCount div 8 bytes, z.B. mit Move. Anschliessend shiftest du BitCount mod 8 Bits.

Gruss Reinhard
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: "Variablenübergreifende" Bitverschiebungen

  Alt 13. Mai 2009, 21:48
Zitat von Reinhard Kern:
Anschliessend shiftest du BitCount mod 8 Bits.
Den Plan hatte ich mittlerweile auch schon, aber so einfach lässt sich das nicht shiften
Aber hab ne Methode:

Ich rechne es mal mit 4 Bit pro Zahl vor:

(1100,1010) shl 2

1100 shl 2 = 0000 = a
1010 shl 2 = 1000 = b

1100 shr 2 = 0011 = c
1010 shr 2 = 0010 = d

Ergebnis:

(a or d) (+) b = 0010 1000
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#8

Re: "Variablenübergreifende" Bitverschiebungen

  Alt 14. Mai 2009, 10:39
Funktioniert für count = 0..7:
Delphi-Quellcode:
function Rol(const AValue, ACount: Byte): Byte register;
asm
  mov cl, dl
  rol al, cl
end;

function ArrayShl(arr: TByteArray; count: integer): TByteArray;
var
  mask0, mask1, b0, b1: Byte;
begin
  Result := Copy(arr);
  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;
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

Re: "Variablenübergreifende" Bitverschiebungen

  Alt 14. Mai 2009, 17:30
Zitat von Blup:
Funktioniert für count = 0..7 [...]
Ah jo das bringt mir ja nix
Habs aber jetzt wie oben beschrieben gelöst
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#10

Re: "Variablenübergreifende" Bitverschiebungen

  Alt 14. Mai 2009, 18:17
Musst du nur shiften oder folgen andere Operationen?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 05:36 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