Битовые сдвиги на указателе C? - PullRequest
9 голосов
/ 04 декабря 2009

Я нахожусь в середине этого C-проекта, который я хочу сделать очень эффективным с точки зрения памяти. В некоторых случаях я использую void * s динамической структуры массива, которую я написал, для хранения битов. Я хочу использовать все 64 (в данном случае) биты.

Я скоро понял, что на самом деле вы не можете делать какие-либо битовые манипуляции с указателем. Поэтому мое решение было следующим:

void *p;
((unsigned long)p) << 4;
((unsigned long)p) & 3;

Это делает работу, но только потому, что на моем компьютере long и указатели имеют одинаковый размер. Будет ли это иметь место во всех (или большинстве) архитектур?

И мой настоящий вопрос: Есть ли более правильный способ манипулирования битами с указателем? Я думал, что этот подход несколько распространен в C (упаковка битов в пустоту *), но я мог ошибаться ...

Ответы [ 4 ]

16 голосов
/ 04 декабря 2009

Если ваш компилятор поддерживает его, заголовок C99 <stdint.h> предоставляет типы intptr_t и uintptr_t, которые должны быть достаточно большими, чтобы содержать указатель в вашей системе, но являются целыми числами, чтобы вы могли выполнять битовые манипуляции. Это не может быть намного более портативным, чем это, если это то, что вы ищете.

8 голосов
/ 04 декабря 2009

Если вам нужно выполнить этот вид манипуляции с указателями, вы можете привести их к intptr_t и uintptr_t, оба из которых можно найти в stdint.h. Они гарантированно определяются как целочисленный тип для конкретной платформы с достаточным количеством битов для хранения указателя.

Там также есть ptrdiff_t, если вам нужно что-то, чтобы удержать разницу между двумя указателями.

3 голосов
/ 04 декабря 2009

Я думаю, что вы пытаетесь решить не ту проблему. Настоящая проблема прямо здесь:

Я использую void * s динамического структура массива я написал для того, чтобы удерживать биты.

Не используйте указатели void для хранения битов. Используйте указатели void для удержания указателей. Используйте целые числа без знака для хранения битов.

2 голосов
/ 04 декабря 2009

Объявление объединения указателя и битового поля.

...