Geben Sie einen uint8_t
Puffer von x
Länge, ich versuche, mit einer Funktion oder einem Makro, die nth Bit (oder n zu n + i) entfernen können, dann links verschiebe die restlichen Bits.Entfernen Sie das n-te Bit aus dem Puffer, und verschieben Sie den Rest
Beispiel # 1:
eingabe 0b0b...
dann ausgegeben 0b76543217 0b654321 ...
Beispiel # 2 sein soll: Wenn die Eingabe:
uint8_t input[8] = {
0b00110011,
0b00110011,
...
};
der Ausgang ohne das erste Bit sollte
sein,uint8_t output[8] = {
0b00110010,
0b01100100,
...
};
Ich habe folgendes t ausprobiert o entferne das erste Bit, aber es funktionierte nicht für die zweite Gruppe von Bits.
/* A macro to extract (a-b) range of bits without shifting */
#define BIT_RANGE(N,x,y) ((N) & ((0xff >> (7 - (y) + (x))) << ((x))))
void removeBit0(uint8_t *n) {
for (int i=0; i < 7; i++) {
n[i] = (BIT_RANGE(n[i], i + 1, 7)) << (i + 1) |
(BIT_RANGE(n[i + 1], 1, i + 1)) << (7 - i); /* This does not extract the next element bits */
}
n[7] = 0;
}
Update # 1 In meinem Fall wird die Eingabe uint64_t Nummer wird, dann werde ich memmov
es nach links einem Ort zu verschieben verwenden.
Update # 2 Die Lösung kann in C/C++, Assembly (x86-64) oder Inline Assembly sein.
Auf x86 gibt es eine Anweisung für das (warten, was?): 'Pdep/pext', hinzugefügt durch die' BMI2' Befehlssatzerweiterung. – EOF
Danke, das ist sehr interessant, ich versuche es. –
Ich bin ein wenig verwirrt durch die Frage. Das Diagramm schlägt vor, dass Sie nicht nur ein Bit entfernen wollen, sondern tatsächlich Bits * s * + 8 * * i * aus einem Bitstrom entfernen möchten, der durch ein Array von * x * Oktetts repräsentiert wird, wobei * s * in [0 , 7], dh dies ist eine besondere Form der Bitstromverdichtung. Eine naive Art wäre es, die Eingangsbits einfach zu durchlaufen, wobei getrennte laufende Zählungen der Anzahl der Bits für Quelle und Ziel beibehalten werden, die anzeigen, wann die Bitkopie unterdrückt werden soll und wann das nächste Oktett abgerufen/abgelegt werden soll. Wäre das für Ihre Zwecke zu langsam? – njuffa