隔了好几天,今晚终于有空来到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罢了。
最后附上我的实验代码:
=======================
- #include <iostream>
- #include <bitset>
- /*顺便提一下,这里为什么不直接使用"using namespace std;"比较简便了,因为这样对于比较大的程序来
- 说不是很好的习惯,因为使用这句话虽然简便了,但是这样导致把std命名空间的所有标准库函数都引进到程序文件里,这样如
- 果以后程序涉及到同名函数名或变量名,将会出现难以调试的错误*/
- using std::cout;
- using std::endl;
- using std::bitset;
- int main()
- {
- bitset<32> bitvec("1010");
- cout << bitvec;
- cout << endl;
- for (int ix = 0; ix != bitvec.size(); ++ix)
- {
- cout << bitvec[ix];
- }
- cout << endl;
- for (ix = bitvec.size() - 1; ix != -1; --ix)
- {
- cout << bitvec[ix];
- }
- cout << endl;
- return 0;
- }
- 结果:
- 00000000000000000000000000001010
- 01010000000000000000000000000000
- 00000000000000000000000000001010
阅读(5961) | 评论(0) | 转发(0) |