Ich bin mitten in diesem C-Projekt, das ich sehr speicher effizient machen möchte. In einigen Fällen verwende ich die void * s einer dynamischen Array-Struktur, die ich geschrieben habe, um Bits zu halten. Ich möchte alle 64 (in diesem Fall) Bits verwenden.Bitverschiebungen auf einem C-Zeiger?
Ich erkannte bald, dass Sie tatsächlich keine Bit-Manipulation auf einem Zeiger tun können. So war meine Lösung des folgenden:
void *p;
((unsigned long)p) << 4;
((unsigned long)p) & 3;
Dies erhält die Arbeit erledigt, aber nur, weil auf meinem Computer, longs und Zeiger sind gleich groß. Wird dies in allen (oder den meisten) Architekturen der Fall sein?
Und meine eigentliche Frage: Gibt es eine richtigere Möglichkeit, Bit-Manipulation auf einem Zeiger zu tun? Ich hatte gedacht, dass dieser Ansatz in C etwas üblich war (Bits in einen void * Verpackung), aber ich könnte falsch sein ...
Ich würde Uint64_t stattdessen von stdint.h – sambowry
Uint64_t wäre zu groß, wenn Ihre Plattform weniger als 64-Bit-Zeiger hat. Verwenden Sie intptr_t und uintptr_t aus derselben Kopfzeile. – tgamblin
@sambowry - Sieht so aus, als müssten Sie 'stdint.h' etwas näher kommen. –