要節省空間的話可以使用位操作來完成,位操作的效率其實挺高的,并沒有你想象的那么低,像樓上的把位操作定義成宏直接用也會被做成函數效率高。下面是使用位操作實現的一個數組和測試,可以改造成一個隊列:C#include//機器字長,一般C/C++規定int類型為機器字長//選擇和機器字長一致的變量可以加快訪問運算速度#defineCPU_SIZEsizeof(unsignedint)//一機器字長能夠保存的比特數#defineCPU_SIZE_BIT(CPU_SIZE*8)//計算_bitlen需要都少個機器字長#defineLEN_OF_BITS(_bitlen)((_bitlen+CPU_SIZE_BIT-1)/CPU_SIZE_BIT)//定義_var為_bitlen比特變量//在C89上,定義需要放在函數開始位置#defineDEFINE_BITS(_var,_bitlen)unsignedint_var[LEN_OF_BITS(_bitlen)]//將_var的第_ix置1#defineBIT_SET(_var,_ix)(_var)[(_ix)/CPU_SIZE_BIT]|=(1<<((_ix)%CPU_SIZE_BIT))//將_var的第_ix置0#defineBIT_RESET(_var,_ix)(_var)[(_ix)/CPU_SIZE_BIT]&=~(1<<((_ix)%CPU_SIZE_BIT))//獲取_var的第_ix位#defineBIT_GET(_var,_ix)(((_var)[(_ix)/CPU_SIZE_BIT]>>((_ix)%CPU_SIZE_BIT))&0x01)//測試用的比特數目#defineBITLEN100intmain(){DEFINE_BITS(bits,BITLEN);//定義bits為BITLEN個位的變量inti;//輸出一下這些bits到底占多少字節printf("sizeof(bits)=%d\n",sizeof(bits));//設置for(i=0;i//只是做個簡單的測試:將3和5倍數位置上的位置位1//其他置0if(i%3==0||i%5==0){//第i個置為1BIT_SET(bits,i);}else{//第i個置為0BIT_RESET(bits,i);}}//輸出for(i=0;iprintf("%02d:%d",i,BIT_GET(bits,i));if(i%10==9){printf("\n");}}return0;}代碼很多常量運算會在編譯階段自動優化,所以不必刻意擔心。測試輸出:E:\TEMP>gcct.c-ot.exe&&t.exesizeof(bits)=1600:101:002:003:104:005:106:107:008:009:110:111:012:113:014:015:116:017:018:119:020:121:122:023:024:125:126:027:128:029:030:131:032:033:134:035:136:137:038:039:140:141:042:143:044:045:146:047:048:149:050:151:152:053:054:155:156:057:158:059:060:161:062:063:164:065:166:167:068:069:170:171:072:173:074:075:176:077:078:179:080:181:182:083:084:185:186:087:188:089:090:191:092:093:194:095:196:197:098:099:1可以看到100位數據的保存只用了16個字節。如你所見,代碼的可讀性變差很多,有的時候需要考慮這種犧牲是否是值得的時間和空間兩者之間本身就是矛盾的,只能根據具體的情況來進行二者之間的權衡。unsignedchar的話空間的確不夠么?位操作的話效率的確跟不上來了么?