Bit-Verschiebung
-
Hi
Ich suche eine einfache und schnelle Möglichkeit zwischen jeweils 2 Bits in einem Wort ein zusätzliches Bit einzufügen.
Z.B: 11001 soll zu 10 10 00 00 10 werden
Also praktisch an jeder zweiten Stelle beginnend bei der ersten eine 0 einfügen.
Das ganze bräuchte ich dann auch noch für jede zweite Stelle beginnend bei der zweiten. (11001 = 01 01 00 00 01)
Die zwei Ergebnisse sollen dann später verodert werden.Hat da einer eine Idee?
Gruß
rean
-
auf die schnelle würd mir jetz einfallen das du deine zahl zerlegst
dann zu jedem etwas hinzufügst und zum schluss wieder alles zusammen-
hängen.gibt bestimmt ncoh leichteres aber das fiel mir grad so ein

-
Ja soweit war ich natürlich auch schon

Aber ich muss das mit 300000 Bytes und mehr machen. Und da wäre das Auseinander- und wieder Zusammenfriemeln doch recht zeitaufwändig.
-
wie wärs in nen string casten oder so und dann per
substring und % vllt einfach ein zeichen adden und dann
wieder casten?
-
Für sowas würde ich auf jeden Fall einen Lookup-Table verwenden. Wenn die CPU auf der das laufen soll einen L1 Cache von >= 1kb hat würde ich einfach einen 8 Bit -> 16 Bit Table verwenden.
Dann brauchst du deine Daten bloss noch Byteweise durchzugehen.Wie du den Table dabei erstellst ist ziemlich egal, da du das bloss 1x machst -- und 256x eine etwas umstäncliche Rechnung durchzuführen damit man dann 300.000x einen schnellen Table-Lookup verwenden kann... sollte denke ich OK sein.
EDIT: wenn du die beiden Zwischenergebnisse nicht brauchst, dann mach gleich alles in einem Schritt, also so dass im Lookup-Table gleich das Endresultat mit den "verdoppelten Bits" drinnen steht. Macht ja keinen Sinn das in 3 Schritten zu machen.
-
rean schrieb:
Hi
Ich suche eine einfache und schnelle Möglichkeit zwischen jeweils 2 Bits in einem Wort ein zusätzliches Bit einzufügen.
Z.B: 11001 soll zu 10 10 00 00 10 werden
Also praktisch an jeder zweiten Stelle beginnend bei der ersten eine 0 einfügen.
Das ganze bräuchte ich dann auch noch für jede zweite Stelle beginnend bei der zweiten. (11001 = 01 01 00 00 01)
Die zwei Ergebnisse sollen dann später verodert werden.Hat da einer eine Idee?
Gruß
reanHi!
Wie wärs mit Inline-Assembler?#include "stdafx.h" void bit2zero (unsigned int* dest, unsigned short* src, size_t count) { _asm{ mov esi, src mov edi, dest mov ecx, count shl ecx, 4 jmp L0 align 16 L0 : lodsw shrd ebx, eax, 16 L1 : shld eax, ebx, 1 //1<< Diese zwei Befehle stehen für x 0 (1 0 od. 0 0) dec ecx shl eax, 1 //2<< wenn du die vertauschst bekommst du 0 x shl ebx, 1 test cl, 01111b jnz L1 stosd or ecx, ecx jne L0 } } int main() { unsigned short src[75000]; unsigned int dest[75000]; src[74999] = 0xffff; bit2zero (dest, src, 75000); unsigned int test = dest[74999]; // test = 2863311530 binary = 10101010101010101010101010101010 }Am einfachsten ist es, wenn du ein Ergebnis im Speicher vorliegen hast,
darauf den Befehl ror oder rol dword ptr[dest], 1 anzuwenden. (d.h. logisch shiften in C/C++)
Das zweite Ergebnis liegt dann sofort vor.mfg
-
Es ist nie zu spät seine Sorgen nach hinten zu verschieben.