第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

C語(yǔ)言中如何最節(jié)省地保存0,1的一個(gè)長(zhǎng)隊(duì)列?

C語(yǔ)言中如何最節(jié)省地保存0,1的一個(gè)長(zhǎng)隊(duì)列?

牧羊人nacy 2019-04-07 11:19:18
現(xiàn)在暫時(shí)我用unsignedchar類(lèi)型來(lái)替代bool,因?yàn)镃語(yǔ)言沒(méi)有bool嘛。如果只是保存的話可以每八位變成一個(gè)char去儲(chǔ)存,但問(wèn)題是我需要快速訪問(wèn)那些位是0還是1
查看完整描述

2 回答

?
郎朗坤

TA貢獻(xiàn)1921條經(jīng)驗(yàn) 獲得超9個(gè)贊

用與&預(yù)算檢測(cè).
#include
//檢測(cè)定義成一個(gè)宏
#defineIS_SET(ch,idx)((ch)&(0x01<<(idx)))
intmain()
{
unsignedcharch=0x14;//二進(jìn)制00010100;
//從右往左,第三位(下標(biāo)從0開(kāi)始,所以程序里是2)是1嗎?
if(IS_SET(ch,2)){
printf("YES\n");
}else{
printf("NO\n");
}
return0;
}
                            
查看完整回答
反對(duì) 回復(fù) 2019-04-07
?
翻過(guò)高山走不出你

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊

要節(jié)省空間的話可以使用位操作來(lái)完成,位操作的效率其實(shí)挺高的,并沒(méi)有你想象的那么低,像樓上的把位操作定義成宏直接用也會(huì)被做成函數(shù)效率高。
下面是使用位操作實(shí)現(xiàn)的一個(gè)數(shù)組和測(cè)試,可以改造成一個(gè)隊(duì)列:
C#include
//機(jī)器字長(zhǎng),一般C/C++規(guī)定int類(lèi)型為機(jī)器字長(zhǎng)
//選擇和機(jī)器字長(zhǎng)一致的變量可以加快訪問(wèn)運(yùn)算速度
#defineCPU_SIZEsizeof(unsignedint)
//一機(jī)器字長(zhǎng)能夠保存的比特?cái)?shù)
#defineCPU_SIZE_BIT(CPU_SIZE*8)
//計(jì)算_bitlen需要都少個(gè)機(jī)器字長(zhǎng)
#defineLEN_OF_BITS(_bitlen)((_bitlen+CPU_SIZE_BIT-1)/CPU_SIZE_BIT)
//定義_var為_(kāi)bitlen比特變量
//在C89上,定義需要放在函數(shù)開(kāi)始位置
#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)
//測(cè)試用的比特?cái)?shù)目
#defineBITLEN100
intmain()
{
DEFINE_BITS(bits,BITLEN);//定義bits為BITLEN個(gè)位的變量
inti;
//輸出一下這些bits到底占多少字節(jié)
printf("sizeof(bits)=%d\n",sizeof(bits));
//設(shè)置
for(i=0;i//只是做個(gè)簡(jiǎn)單的測(cè)試:將3和5倍數(shù)位置上的位置位1
//其他置0
if(i%3==0||i%5==0){
//第i個(gè)置為1
BIT_SET(bits,i);
}
else{
//第i個(gè)置為0
BIT_RESET(bits,i);
}
}
//輸出
for(i=0;iprintf("%02d:%d",i,BIT_GET(bits,i));
if(i%10==9){
printf("\n");
}
}
return0;
}
代碼很多常量運(yùn)算會(huì)在編譯階段自動(dòng)優(yōu)化,所以不必刻意擔(dān)心。
測(cè)試輸出:
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位數(shù)據(jù)的保存只用了16個(gè)字節(jié)。
如你所見(jiàn),代碼的可讀性變差很多,有的時(shí)候需要考慮這種犧牲是否是值得的
時(shí)間和空間兩者之間本身就是矛盾的,只能根據(jù)具體的情況來(lái)進(jìn)行二者之間的權(quán)衡。unsignedchar的話空間的確不夠么?位操作的話效率的確跟不上來(lái)了么?
                            
查看完整回答
反對(duì) 回復(fù) 2019-04-07
  • 2 回答
  • 0 關(guān)注
  • 305 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)