Dirty Oerti hat geschrieben:Nun möchte ich darin möglichst effizient (Das ist hierbei das wichtige) z.B. die Bitfolge 0000 suchen.
Wie mach ich das?
Pro Byte gibt es nur eine bestimmte Anzahl Muster, die Du prüfen musst:
- 10000000 post 1
- 11000000 post 2
- 11100000 post 3
- 11110000 match
- 01111000 match
- 00111100 match
- 00011110 match
- 00001111 match
- 00000111 pre 1
- 00000011 pre 2
- 00000001 pre 3
Die Einser erfordern Übereinstimmung, die 0er sind Dir egal. Also kannst Du & verwenden. Du musst hast also 5 Muster, die sofort einen Treffer signalisieren, Du hast 3 Muster, die ein Prefix darstellen, denen im nachfolgenden Byte ein Postfix folgen muss, damit es ein match ist. Hast Du zuvor kein Prefix gefunden, brauchst Du auf Postfixe schonmal nicht mehr zu achten. Hast Du prefix 3 gefunden, brauchst Du postfix 1 und 2 auch nicht mehr zu prüfen.
Heißt pro Byte maximal 11 Vergleiche, im Regelfall 8. Programmierst Du die 11 Möglichkeiten aus, so dass Du eine Statusmaschine erhälst, sollte das sehr schnell sein. If-Abfragen kosten hier richtig Zeit.
Möglichkeit 2:
Du nimmst ein Short, machst ein & auf 0xF000 und guckst, um es Dein Suchmuster ergibt. Du hast maximal 16 Möglichkeiten, also machst Du ein Array, wo Du den Ergebniswert von & als Index verwendest, der Dir sagt, ob Du 1, 2, 3 oder sogar vier Bits verschieben kannst. Nachdem Du acht Bit verschoben hast, lädst Du das nächste Byte ins Deine Short-Testvariable rein. Auch hier gilt - ifs vermeiden, so programmieren, dass hier einfach durchgerannt werden kann.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.