2010-11-21 6 views
1

Ich habe einen Zeiger auf eine vorzeichenlose Char-Array, z. unsigned char *uc_array. Wenn ich den Inhalt, um den die Adresse zeigt, um 8 Bits nach rechts verschiebe, werden sie in uc_array + 1 sein?C Bit Manipulation Char-Array

+0

Hinweis: Ich habe die 'uc_array ++' des OPs in 'uc_array + 1' geändert. –

Antwort

3

Durch Verschieben des Inhalts wird der Wert geändert und nicht in den Speicher verschoben.

+0

Sie werden immer noch in 'uc_array ++ 'obwohl (post inc). –

0

Nein .... Wenn Sie einen Zeiger *uc_array++ dereferenzieren, erhöhen Sie den Wert dessen, auf was der Zeiger zeigt. Wenn Sie dies tun, erhöhen Sie jedoch die Adresse des Zeigers uc_array++, der auf den "nächsten benachbarten Wert" zeigt, der von *uc_array zurückgegeben wird.

Vergessen Sie nicht, dass die Zeigerarithmetik auf der Größe des Typ des Zeigers, für Zeichenzeiger abhängig ist, ist es 1, für ints, seine 4 je nach Plattform und verwendet Compiler ...

0

nur Ihre Frage macht Sinn für mich, wenn wie

interpretiert
memmove(uc_array + 1, uc_array, bytesize_of_array); 

ich nehme an, Sie auf 8-Bit-Byte-Plattform sind, und dass Sie durch Verschieben der Bits bedeuten verschieben, wenn sie als lange bit- interpretiert Sequenz von aufeinanderfolgenden Bytes (und es muss eins sein char nach dem Array, um die Verschiebung zu berücksichtigen). Dann wird der unter der Adresse uc_array gespeicherte Wert unter uc_array + 1 gespeichert.

Allerdings, wenn Sie diese

for(unsigned char *x = uc_array; x != uc_array + byte_count; ++x) 
    *x >>= 8; 

eine Schleife zu tun und gehen davon aus 8-Bit-Bytes Sie gerade dort alles zunichte machen, Byte für Byte alle Bits Verschiebung weg.

0

Nein. Änderungen an einem Wert wirken sich nur auf diesen Wert und nicht auf benachbarte Werte aus. Dies schließt die Schichtbetreiber ein.

Die Bits, die von einem Schichtoperator herausgeschoben werden, sind "verloren".

0

Es hängt davon ab, wie Sie Ihre Daten verschieben. Wenn Sie so etwas tun (quint16) (* uc_array) >> 8, wird das erste Byte in das zweite verschoben. Aber wenn nur (* uc_array) >> 8 dann, wie die anderen sagt, werden Sie Ihre Daten leeren.