使用位打包来模拟c中3d数组的功能

时间:2014-08-28 02:13:13

标签: c arrays performance multidimensional-array bit-manipulation

我有一个包含以下尺寸的3d布尔数组:   bool myArray [streamCount] [dayCount] [minuteCount]; 哪里 dayCount = 500,streamCount = 11,000,minuteCount = 400;

我试图通过使用位打包来显着缩小此数组的内存要求。   我需要保留随机访问任何值的能力,就像我现在使用3d数组一样。

以下是我设计的(脑死亡)方案。它有一个问题,要找到价值,我需要设置 8如果陈述。有更简单的方法吗?

#define STREAM_COUNT 11000
#define DAY_COUNT 500

typedef struct s_minuteStorage 
 {
 unsigned char a: 1;
 unsigned char b: 1;
 unsigned char c : 1;
 unsigned char d : 1;
 unsigned char e: 1;
 unsigned char f: 1;
 unsigned char g : 1;
 unsigned char h : 1;

 } minuteStorage;


typedef struct s_itemStorage
{
    minuteStorage Minutes[STREAM_COUNT][50];
} itemStorage;

itemStorage *Items;

void allocStorage(void)
{
    Items = (itemStorage *) ecalloc(DAY_COUNT, 1);
}


int getMinuteValue(int minuteIndex, int dayIndex, int streamIndex)
{
    int minuteArrayIndex = minuteIndex / 8;
    int remainder = minuteIndex % 8;
    int value;

    if (remainder == 0)
        value = Items[dayIndex].Minutes[streamIndex][minuteArrayIndex].a;
    if (remainder == 1)
        value = Items[dayIndex].Minutes[streamIndex][minuteArrayIndex].b;
    if (remainder == 2)
        value = Items[dayIndex].Minutes[streamIndex][minuteArrayIndex].c;

    //  etc

    return(value);
}

1 个答案:

答案 0 :(得分:0)

您可以使用unsigned char并移位适当的位数,而不是使用结构:

typedef unsigned char minuteStorage;

int getMinuteValue(int minuteIndex, int dayIndex, int streamIndex)
{
    int minuteArrayIndex = minuteIndex / 8;
    int remainder = minuteIndex % 8;
    minuteStorage m = Items[dayIndex].Minutes[streamIndex][minuteArrayIndex];
    return (m >> remainder) & 1;
}