0

我有一個3d布爾數組,其維數如下: bool myArray [streamCount] [dayCount] [minuteCount]; 其中 dayCount = 500,streamCount = 11,000且minuteCount = 400;使用位打包來模擬3d數組的功能c

我想通過使用位打包來顯着縮小此數組的內存要求。 我需要保留隨機訪問任何值的能力,就像我現在使用3d數組一樣。

下面是我設計的(腦死亡)方案。它存在的問題是要找到值,我需要設置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); 
} 

回答

0

而不是使用一個struct的,你可以只使用一個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; 
} 
+0

謝謝你,要好得多。要設置值,它會是:(Items [dayIndex] .Minutes [streamIndex] [minuteArrayIndex] << remaining)| = 1? – PaeneInsula 2014-08-28 02:43:17

+0

@ user994179:不完全。試試'm | = 1 << remaining'。 – 2014-08-28 02:57:35

+0

在大多數架構中int會比char更快嗎? – 2014-08-28 05:19:30