使用位封装来模拟c中三维阵列的功能



我有一个三维布尔数组,包含以下维度:bool myArray[streamCount][dayCount][minuteCount];哪里dayCount=500,streamCount=11000,minuteCount=400;

我正试图通过使用位打包来显著减少此阵列的内存需求。我需要保留随机访问任何值的能力,就像我现在对3d数组所做的那样。

下面是我设计的(脑死亡)方案。它的问题是,要找到值,我需要设置8 if语句。有更简单的方法吗?

#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);
}

不使用结构,只需使用无符号字符并按适当的位数移位即可:

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;
}

最新更新