亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C語言中如何最節省地保存0,1的一個長隊列?

C語言中如何最節省地保存0,1的一個長隊列?

一只名叫tom的貓 2019-04-16 17:05:47
現在暫時我用unsignedchar類型來替代bool,因為C語言沒有bool嘛。如果只是保存的話可以每八位變成一個char去儲存,但問題是我需要快速訪問那些位是0還是1
查看完整描述

2 回答

?
慕的地10843

TA貢獻1785條經驗 獲得超8個贊

用與&預算檢測.
#include
//檢測定義成一個宏
#defineIS_SET(ch,idx)((ch)&(0x01<<(idx)))
intmain()
{
unsignedcharch=0x14;//二進制00010100;
//從右往左,第三位(下標從0開始,所以程序里是2)是1嗎?
if(IS_SET(ch,2)){
printf("YES\n");
}else{
printf("NO\n");
}
return0;
}
                            
查看完整回答
反對 回復 2019-04-16
?
白板的微信

TA貢獻1883條經驗 獲得超3個贊

要節省空間的話可以使用位操作來完成,位操作的效率其實挺高的,并沒有你想象的那么低,像樓上的把位操作定義成宏直接用也會被做成函數效率高。
下面是使用位操作實現的一個數組和測試,可以改造成一個隊列:
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)
//測試用的比特數目
#defineBITLEN100
intmain()
{
DEFINE_BITS(bits,BITLEN);//定義bits為BITLEN個位的變量
inti;
//輸出一下這些bits到底占多少字節
printf("sizeof(bits)=%d\n",sizeof(bits));
//設置
for(i=0;i//只是做個簡單的測試:將3和5倍數位置上的位置位1
//其他置0
if(i%3==0||i%5==0){
//第i個置為1
BIT_SET(bits,i);
}
else{
//第i個置為0
BIT_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.exe
sizeof(bits)=16
00:101:002:003:104:005:106:107:008:009:1
10:111:012:113:014:015:116:017:018:119:0
20:121:122:023:024:125:126:027:128:029:0
30:131:032:033:134:035:136:137:038:039:1
40:141:042:143:044:045:146:047:048:149:0
50:151:152:053:054:155:156:057:158:059:0
60:161:062:063:164:065:166:167:068:069:1
70:171:072:173:074:075:176:077:078:179:0
80:181:182:083:084:185:186:087:188:089:0
90:191:092:093:194:095:196:197:098:099:1
可以看到100位數據的保存只用了16個字節。
如你所見,代碼的可讀性變差很多,有的時候需要考慮這種犧牲是否是值得的
時間和空間兩者之間本身就是矛盾的,只能根據具體的情況來進行二者之間的權衡。unsignedchar的話空間的確不夠么?位操作的話效率的確跟不上來了么?
                            
查看完整回答
反對 回復 2019-04-16
  • 2 回答
  • 0 關注
  • 362 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號