I auf den schnellsten Weg suchen, die Anzahl der b -Bit Subsequenzen des Zählens (nicht überlappend), die Null in einer uint8_t
Array von beliebiger Größe S sind (S ist normalerweise jedoch klein).Zählung Null b-Bit-Untersequenzen in einem Byte-Array
Constraints:
- b ist immer eine Potenz von zwei ist, sind die gültigen Werte tatsächlich nur: 1, 2, 4, 8, 16 und 32
- es, dass die Anzahl von Bits angenommen wird, in einem
uint8_t
ist 8 und die S * 8 teilbar durch b
Beispiele:
- b = 4, array =
0xA0 0x39 0x04 0x30
- richtige Antwort 3 - b = 1, array =
0xFF 0x1F 0xF8
- richtige Antwort 6 - b = 16, array =
0x05 0x16 0x32 0x00
- richtige Antwort ist 0
Was ich gerade mache ist, dass ich die Bits in Bytes "entpacke" und dann die Untersequenzen mit einem Nullpuffer memcmp, aber es scheint mir, dass es einen schnelleren Weg dafür geben sollte.
Gute Frage, nur der Vollständigkeit halber: Was ist die Endianness? Ist die Antwort 1 für 'b = 4' und' array = [0xFC 0x3F] '? Oder ist es für 'array = [0x3F 0xFC]'? – BeyelerStudios
@BeyelerStudios: Guter Fang. Ich nehme den kleinen Endian an. Für 'b = 4' und jedes dieser Felder ist die Antwort '0', da es keine 4-Bit-Teilfolge gibt, die nur Nullen ist. Die Untersequenzen sind nicht überlappend, so dass sie die Bits 0-3, 4-7 usw. vergleichen. – PeterK
Es gibt jedoch eine nicht überlappende 4-Bit-Untersequenz in "1111110000111111" (d. H. "0xFC3F"). -> non-overlaping bedeutet, dass die b-Bit Subsequenzen einander nicht überlappen, nicht dass Sie nicht mehrere Bytes überlappen können (sonst wie würden Sie> 8-Bit Subsequenzen machen?) – BeyelerStudios