???
一、傳統(tǒng)的C方式位操作:
1.基本操作:
?? 使用一個unsigned int變量來作為位容器。
2.操作符:
|?? 按位或操作符:result=exp1|exp2;當exp1和exp2中對應位中至少有一個為1時,result中對應位為1,否則為0。
&??按位與操作符::result=exp1&exp2;當exp1和exp2中對應位全為1時,result中對應位為1,否則為0。
^? 按位異或或操作符:result=exp1^exp2;當exp1和exp2中對應位不相同時,result中對應位為1,否則為0。
~? 反轉(zhuǎn)操作符:將位容器中的所有位都反轉(zhuǎn),1變?yōu)?,0變?yōu)?。
<< 按位左移操作符:exp<<n,將容器中所有的位向左移n位,空出的位用0填充。
>> 按位右移操作符:exp>>n,將容器中所有的位向右移n位,空出的位用0填充。
|=,&=,^= 分別對應|&^三種操作符的復合操作符。
3.常用操作
?? 這里我們假設有一個result的unsigned int變量用來儲存32個學生的成績(通過和不通過分別用0和1),這樣result就有33位(result從右至左,從0開始計算位數(shù),在這個例子中0位被浪費)。
(a) 將第27位設置為及格(設作1)其他位不變:
?? result|=(1<<27) //任意的位值與1作按位或操作其值為1,而與0作按位與操作其值不變
(b) 將第27位設置成不及格(設為0)。
?? result&=~(1<<27) //任意的位值與0作按位與操作其值為0,而與1作按位與操作其值不變
(c) 反轉(zhuǎn)第27位的值。
?? result^=(1<<27) //任意的位值與1作按位異或操作其值為1,而與0作按位異與操作其值不變
?
二、C++中的bitset容器
1.頭文件:
? #include <bitset>
2.聲明一個容器:
?(a)聲明一個指定位數(shù)的空容器(所有位設為0): bitset<int> bits;
?(b)聲明一個指定位數(shù)并將指定的幾個位初始化為相應值的容器: bitset<n> bits(int);
???? bitdet<int> bits(string&)
總結(jié):bitset模板類中類型參數(shù)傳遞容器的位數(shù),而構(gòu)造函數(shù)參數(shù)通過一個int或一個string&值來從右至左初始化容器中的相應值。
3.bitset的基本用法:

4.bitset與傳統(tǒng)C位操作及字符串的轉(zhuǎn)換
?? 可以通過to_string()成員將容器轉(zhuǎn)輸出為一個string字符串,另外還可以用to_long()成員將容器輸出到傳統(tǒng)的用于C風格的位容器中。如:
? unsigned long bits = bits.to_long();
? sting str(bits.to_string());
5.bitset支持所有的位操作符。