Autor |
Beitrag |
gerd99
Beiträge: 22
|
Verfasst: Di 05.05.20 22:28
Hallo
ich möchte gerne von einer 64 Bit-Kette ein paar bits verschieben,
ich möchte das 10 bit an erster Stelle
das 18 bit an zweiter Stelle
das 26 an dritter Stelle
Wichtig sind mir die ersten 8 Stellen, der Rest ist dann egal.
wie macht man das am schnellsten.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| function Bittest (TestZahl : uint64; Bitnr: uint64):boolean; begin Result := (testzahl and (uint64(1) shl bitnr)) <> 0; end;
procedure BitSet(var TestZahl :uint64; bitnr:uint64); begin TestZahl:= testzahl OR (uint64(1) shl BitNr); end;
var zahl,b:uint64; b:=0; zahl:=389282;
if bittest(zahl,10) then bitset(b,0); if bittest(zahl,18) then bitset(b,1); if bittest(zahl,26) then bitset(b,2); usw. |
da muss es doch eine schnellere Methode geben? Aber mit shl verschiebe ich alles und ich möchte praktische einzelne bit in der mitte umd x nach links verschieben.
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 06.05.20 09:12
Moin!
Es klingt nicht besonders gut geplant, was du vor hast (ohne genau zu wissen, was du da tust, reines Bauchgefühl). Wenn du doch nur 3 Bits "brauchst", warum nimmst du dann nicht gleich die Bits 0, 1 und 2? Und vor allem, warum ausgerechnet ein 64-Bit-Int (für 3 Nutzbits)? Aber egal, das war ja nicht gefragt.
Du maskierst die Ziel-Stellen mit einer AND-Maske aus, verschiebst die Ziel-Bits, maskierst diese so, dass nur noch die Ziel-Stellen gesetzt sein können und übernimmst mit OR. Fertig.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 06.05.20 10:57
Meine Delphi/Pascal Kenntnisse sind ein wenig eingerostet aber dein Code scheint die Bits zu kopieren nicht zu verschieben. Was willst du wirklich verschieben oder kopieren?
|
|
gerd99
Beiträge: 22
|
Verfasst: Mi 06.05.20 17:58
Delphi-Quelltext 1: 2: 3:
| if bittest(zahl,10) then bitset(zahl,0); if bittest(zahl,18) then bitset(zahl,1); if bittest(zahl,26) then bitset(zahl,2); |
Ich mache es an einem Beispiel verständlich
00000000
01000000
01000000
00000000
01000000
01000000
01000000
01000000
Ich möchte den 10 an erster Stelle und den 18 an zweiter Stelle. Sieht dann so aus:
110111x
xxxxxxx
xxxxxxx
xxxxxxx
xxxxxxx
xxxxxxx
xxxxxxx
xxxxxxx
Und das genannte Verfahren von mir schien mir schneller zu gehen. Aber ich habe schon eine private Nachricht bekommen, die das Problem offensichtlich löst.
Gerd
|
|
gerd99
Beiträge: 22
|
Verfasst: Mi 06.05.20 19:58
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| test:=0; bitset(test,9); bitset(test,17); bitset(test,25); test:= (Uint64(test)) or ((test shr 9) and uint64(1)) or ((test shr 16) and uint64(2)) or ((test shr 23) and uint64(4));
if bittest(test,0) then memo2.Lines.Add('1'); if bittest(test,1) then memo2.Lines.Add('2'); if bittest(test,2) then memo2.Lines.Add('3'); |
Alle 3 bits sind an gewünschter Stelle. Eine Frage habe ich. Um wieviel ist das schneller als das Anfangsbeispiel. Oder es würde mir schon ausreichen, wenn
jemand sagen könnte, dass diese Methode schneller ist.
|
|
jfheins
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Mi 06.05.20 21:07
gerd99 hat folgendes geschrieben : |
Alle 3 bits sind an gewünschter Stelle. Eine Frage habe ich. Um wieviel ist das schneller als das Anfangsbeispiel. Oder es würde mir schon ausreichen, wenn
jemand sagen könnte, dass diese Methode schneller ist. |
Diese letzte Methode ist wesentlich langsamer, da auf eine VCL Komponente zugegriffen wird. Wahrscheinlich mehr als einen Faktor 100.
Falls du es genau wissen musst, teste es am Besten selbst. Niemand kennt die Randbedingungen (CPU, Performance-Anforderungen) besser als du
|
|
gerd99
Beiträge: 22
|
Verfasst: Mi 06.05.20 21:19
die Zeile 8 - 13 mit der memo Ausgabe verwende ich natürlich nicht in meinem Programm.
Langsamer - wirklich?
Ja, ich teste das mal, wenn ich mit der eigentlichen Routine die ich gerade schreibe fertig bin.
Gerd
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 06.05.20 22:48
Moin!
gerd99 hat folgendes geschrieben : | Aber ich habe schon eine private Nachricht bekommen, die das Problem offensichtlich löst. |
Wozu macht man sich eigentlich die Mühe, hier noch irgendwas zu schreiben... Und dann nichtmal darauf eingehen.
gerd99 hat folgendes geschrieben : | Delphi-Quelltext 1: 2: 3:
| if bittest(zahl,10) then bitset(zahl,0); if bittest(zahl,18) then bitset(zahl,1); if bittest(zahl,26) then bitset(zahl,2); | |
Ralf Jansen hat folgendes geschrieben : | Meine Delphi/Pascal Kenntnisse sind ein wenig eingerostet aber dein Code scheint die Bits zu kopieren nicht zu verschieben. |
@Ralf: Deine Kenntnisse sind offensichtlich nicht verrostet, das ist kein äquvalenter Code!
gerd99 hat folgendes geschrieben : | Und das genannte Verfahren von mir schien mir schneller zu gehen. |
Abgesehen davon, dass dein Code nicht das gleiche tut, ist er mit sicherheit langsamer, als das hier (was genau das ist, was ich beschrieben habe), da brauche ich keinen Profiler für: (conditionals, jumps, stack, etc. ggü. bitmanipulations, die der Compiler in Register optimieren kann/könnte)
Delphi-Quelltext 1:
| test:= (Uint64(test)) or ((test shr 9) and uint64(1)) or ((test shr 16) and uint64(2)) or ((test shr 23) and uint64(4)); |
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
gerd99
Beiträge: 22
|
Verfasst: Mi 06.05.20 23:14
Hallo Narses,
das mit der Bitmaske hast Du auch geschrieben. Ich konnte mir darunter im ersten Moment nur nichts vorstellen, wie du das genau meintest.
Schönen Abend
Gerd
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 07.05.20 13:52
Moin gerd99!
gerd99 hat folgendes geschrieben : | das mit der Bitmaske hast Du auch geschrieben. |
Jetzt versteh ich das erstmal...
Es geht mir nicht darum oder gegen den Strich, ignoriert zu werden (das können andere eh viel besser ), sondern um die "Lösung per PN". Wir sind hier in einem Forum, um Wissen zu verbreiten und nicht zu verstecken (per PN ), das war der Grundgedanke.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
Für diesen Beitrag haben gedankt: Sinspin
|
|
devOX96
Hält's aus hier
Beiträge: 10
Programmieren, Wandern, Fussball
|
Verfasst: Mi 25.11.20 11:53
Auch von mir vielen Dank für die hilfreichen Antworten, hat mir sehr geholfen.
|
|
|