Chinaunix首页 | 论坛 | 博客
  • 博客访问: 631832
  • 博文数量: 1008
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 5175
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-31 09:44
文章分类
文章存档

2012年(1008)

我的朋友

分类:

2012-08-01 11:08:25

原文地址:标准库 bitset 作者:luozhiyong131

参考一《C++Primer4th第四版中文版》

有些程序要处理二进制位的有序集,每个位可能包含 0(关)1(开)值。位是用来保存一组项或条件的 yes/no 信息(有时也称标志)的简洁方法。标准库提供的 bitset 类简化了位集的处理。 要使用 bitset 类就必须包含相关的头文件。

#include

using std::bitset;

 

bitset 对象的定义和初始化

在定义 bitset 时,要明确 bitset 含有多少位,须在尖括号内给出它的长度值:

bitset b; b n 位,每位都0

bitset b(u); b unsigned long u 的一个副本

bitset b(s); b string 对象s 中含有的位串的副本

bitset b(s, pos, n); b s 中从位置pos 开始的&nbps;n 个位的副本。

 

/*

 * unsigned 值初始化bitset 对象

 * Lzy  2011-8-12

 */

#include

#include

using namespace std;

 

int main(void)

{

    bitset<16> bitvecl(0xffff);// bits 0 ... 15 are set to 1

    bitset<32> bitvecl(0xffff);// bits 0 ... 15 are  set to 1; 16 ... 31 are 0

 

    return 0;

}

 

/*

 * string 对象初始化bitset 对象

 * string 对象读入位集的顺序是从右向左

 * Lzy  2011-8-12

 */

#include

#include

#include

using namespace std;

 

int main(void)

{

    string strval("1100");

    bitset<32> bitvec(strval);/*string 对象和bitsets 对象之间是反向转化的:string 对象

                              的最右边字符用来初始化bitset 对象的低阶位*/

    string str("1111111000000011001101");

    bitset<32> bitvec1(str,5,4);// 4 bits starting at str[5], 1100

    bitset<32> bitvec6(str, str.size() - 4);    // 取出str 末尾的四位来对bitvec6 的低四位进行初始化

   

    return 0;

}

 

bitset 对象上的操作

b.any()          b 中是否存在置为 1 的二进制位?

b.none()         b 中不存在置为 1 的二进制位吗?

b.count()       b 中置为 1 的二进制位的个数

b.size()          b 中二进制位的个数

b[pos]           访问 b 中在 pos 处二进制位

b.test(pos)     b 中在 pos 处的二进制位置为 1 么?

b.set()           b 中所有二进制位都置为 1 

b.set(pos)      b 中在 pos 处的二进制位置为 1

b.any()          b 中是否存在置为 1 的二进制位?

b.reset()               b 中所有二进制位都置为 0

b.reset(pos)   b 中在 pos 处的二进制位置为 0

b.flip()           b 中所有二进制位逐位取反

b.flip(pos)      b 中在 pos 处的二进制位取反

b.to_ulong()   b 中同样的二进制位返回一个 unsigned long

os << b         b 中的位集输出到 os

 

/*

 * 测试整个bitset 对象

 * Lzy  2011-8-12

 */

#include

#include

#include

using namespace std;

 

int main(void)

{

    string str("1111111000000011001101");

    bitset<32> bitvec(str);

 

    if(bitvec.any())

        cout<<"is_set"<

    else

        cout<<"is_not_set"<

 

    cout<<"1的个数: "<

 

    cout<< bitvec.size()<<""<

 

    return 0;

}

 

/*

 * 访问bitset 对象中的位

 * Lzy  2011-8-12

 */

#include

#include

#include

using namespace std;

 

int main(void)

{  

    bitset<32> bitvec;

    for(int i=0; i != 32; i+=2)

        bitvec.set(i);      //bitvec[i]=1;

 

    for(int i=0; i != 32; i++)

    {

        if(bitvec.test(i))

            cout<<"1";

        if(!bitvec[i])

            cout<<"0";

    }

 

    return 0;

}

 

/*

 * 对整个bitset 对象进行设置 

 * Lzy  2011-8-12

 */

#include

#include

#include

using namespace std;

 

int main(void)

{  

    bitset<32> bitvec; 

    bitvec.set();       //set all the bits to 1

 

    for(int i=0; i != 32; i++)

    {

        if(bitvec.test(i))

            cout<<"1";

        else

            cout<<"0";

    }

    cout<

 

    bitvec.reset();// set all the bits to 0.

    for(int i=0; i != 32; i++)

    {

        if(bitvec[i])

            cout<<"1";

        else

            cout<<"0";

    }

    cout<

 

    return 0;

}

 

/*

 * 对整个bitset 对象进行设置 

 * Lzy  2011-8-12

 */

#include

#include

#include

using namespace std;

 

int main(void)

{      

    bitset<32> bitvec(0x5); //0101

    bitvec.flip(0);         //第位取反

    bitvec.flip();          //按位取反

    for(int i=0; i != 4; i++)

    {

        if(bitvec.test(i))

            cout<<"1";

        else

            cout<<"0";

    }

    cout<

 

    return 0;

}

 

/*

 * 获取bitset 对象的值 

 * Lzy  2011-8-12

 */

#include

#include

#include

using namespace std;

 

int main(void)

{      

    bitset<32> bitvec(0x55); //0101

    unsigned long ulong = bitvec.to_ulong();

    cout<<"ulong = "<  

    cout<<"bitvec: "< //输出二进制位

    return 0;

}

阅读(135) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~