Chinaunix首页 | 论坛 | 博客
  • 博客访问: 52944
  • 博文数量: 9
  • 博客积分: 553
  • 博客等级: 中士
  • 技术积分: 95
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-20 16:36
文章分类
文章存档

2011年(3)

2010年(6)

分类: C/C++

2011-04-19 21:20:29

隔了好几天,今晚终于有空来到chinaunix发表下对bitset类型的看法,最近很累,但还是抽点时间来总结一下下。
前几天对bitset有一个模糊的概念,对bitset对象里面的存储顺序不太清楚,于是写了一个小程序验证了一下,终于领悟到了这点小case。
首先声明一个bitset对象:
bitset<32> bitvec;
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开始的n个位的副本

1.定义一个unsigned long型的副本
例:
unsigned long tmp = 1111;
bitset<32> bitvec(tmp);
那么把bitvec对象给cout出来是:00000000000000000000000000001111吗?
答案显示是不对的,前几天我马虎了,原来bitset类的构造函数把tmp的十进制值给转换到了二进制(10001010111),所以
bitvec输出是:00000000000000000000010001010111。
如果想让tmp直接输出00000000000000000000000000001111的话,那么只需将tmp更改为十六进制0xf即可(unsgined long tmp = 0xf)。
2.定义一个string型的副本
例:
string str("1111");
bitset<32> bitvec(str);
那么bitvec对象cout出来就是:00000000000000000000000000001111。

好了,我前几天遇到的问题出来了,现在拿string型的副本来讨论,现在bitset里面到底是怎么存储str对象的字符串字面值呢??
bitvec对象里面存储的是00000000000000000000000000001111,
还是11110000000000000000000000000000呢?
还没遇到这个模糊问题的时候,我用cout输出bitvec对象的值,跟我用for循环从bitvec对象的第0位输出到第31位的结果竟然是不一样的。。
当执行:cout << bitvec; //result = 00000000000000000000000000001111;
当执行:
for (unsigned int ix = 0; ix != 32; ++ix)
{
 cout << bitvec[ix];
}
//result = 11110000000000000000000000000000
现在已经很清楚的知道,bitvec对象是把string对象里面的值先转换成二进制值,然后再倒过来存储。
用1111可能看得不是很清楚,
那么现在:
string str("1010");
bitset<32> bitvec(str);
通过上面那个for循环输出的结果是:01010000000000000000000000000000,
这样看起来就比较直观了。
一般平时要输出bitset对象时,都是用cout输出,因为cout已经重载了各种各样的运算符,用for循环输出只是为了更加深入的去理解bitset罢了。
最后附上我的实验代码:
=======================
  1. #include <iostream>
  2. #include <bitset>
  3. /*顺便提一下,这里为什么不直接使用"using namespace std;"比较简便了,因为这样对于比较大的程序来
  4. 说不是很好的习惯,因为使用这句话虽然简便了,但是这样导致把std命名空间的所有标准库函数都引进到程序文件里,这样如
  5. 果以后程序涉及到同名函数名或变量名,将会出现难以调试的错误*/
  6. using std::cout;
  7. using std::endl;
  8. using std::bitset;
  9. int main()
  10. {
  11.  bitset<32> bitvec("1010");
  12.  cout << bitvec;
  13.  cout << endl;
  14.  for (int ix = 0; ix != bitvec.size(); ++ix)
  15.  {
  16.   cout << bitvec[ix];
  17.  }
  18.  cout << endl;
  19.  for (ix = bitvec.size() - 1; ix != -1; --ix)
  20.  {
  21.   cout << bitvec[ix];
  22.  }
  23.  cout << endl;
  24.  return 0;
  25. }
  26. 结果:
  27. 00000000000000000000000000001010
  28. 01010000000000000000000000000000
  29. 00000000000000000000000000001010
阅读(5961) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~