Как использовать int в качестве массива int / bools? - PullRequest
2 голосов
/ 26 февраля 2010

Я заметил при создании программы, что многие из моих переменных типа int никогда не превышали десяти. Я полагаю, что, поскольку int - это 2 байта самое короткое (1, если считать char), поэтому я должен иметь возможность хранить 4 unsigned ints с максимальным значением 15 в коротком int, и я знаю, что можно получить доступ к каждому по отдельности, используя >> и <<:

short unsigned int SLWD = 11434;
S is (SLWD >> 12), L is ((SLWD << 4) >> 12),
W is ((SLWD << 8) >> 12), and D is ((SLWD << 8) >> 12)

Однако я понятия не имею, как включить это в функцию класса, поскольку любой тип GetVal() должен иметь тип int, что в первую очередь противоречит цели выделения битов.

Ответы [ 3 ]

4 голосов
/ 26 февраля 2010

Во-первых, запомните Правила оптимизации .Но это возможно в C или C ++ с использованием битовых полей:

struct mystruct {
    unsigned int smallint1 : 3; /* 3 bits wide, values  0 -- 7 */
    signed int   smallint2 : 4; /* 4 bits wide, values -8 -- 7 */
    unsigned int boolean   : 1; /* 1 bit  wide, values  0 -- 1 */
};

Стоит отметить, что, хотя вы выигрываете, не требуя такого большого объема памяти, вы теряете, потому что становится дороже получить доступ ко всему, поскольку каждое чтение или записьтеперь с ним связана куча немного крутящейся механики.Учитывая, что хранилище дешево, оно, вероятно, не стоит.

Редактировать: Вы также можете использовать vector<bool> для хранения 1-битных булев;но остерегайтесь этого, потому что это не действует как нормальный vector!В частности, он не предоставляет итераторов.Это достаточно отличается, что справедливо будет сказать, что vector<bool> на самом деле не vector.Скотт Майерс очень четко написал на эту тему в «Эффективном STL».

2 голосов
/ 26 февраля 2010

В C и с единственной целью экономии места вы можете переосмыслить беззнаковое шорт как структуру с битовыми полями (или использовать такую ​​структуру, не мешая с реинтерпретациями):

#include <stdio.h>

typedef struct bf_
{
   unsigned  x : 4;
   unsigned  y : 4;
   unsigned  z : 4;
   unsigned  w : 4;
} bf;


int main(void)
{
   unsigned short i = 5;
   bf *bitfields = (bf *) &i;

   bitfields->w = 12;
   printf("%d\n", bitfields->x);
   // etc..

   return 0;
}
1 голос
/ 26 февраля 2010

Это очень распространенная техника. Вы обычно выделяете массив большего примитивного типа (например, целые или длинные) и имеете некоторую абстракцию для работы с отображением. Если вы используете OO-язык, обычно хорошей идеей будет определить какой-то BitArray или SmartArray или что-то в этом роде и использовать getVal (), который принимает индекс. Важно убедиться, что вы скрываете детали внутреннего представления (например, когда вы перемещаетесь между платформами).

При этом большинство основных языков уже имеют эту функциональность доступной.
Если вам нужны биты, у WikiPedia есть хороший список. Если вам нужно больше, чем бит, вы все равно можете найти что-то или реализовать это самостоятельно с помощью аналогичного интерфейса. Взгляните на Java BitSet для справки

...