隔了好几天,今晚终于有空来到chinaunix发表下对bitset类型的看法,最近很累,但还是抽点时间来总结一下下。 前几天对bitset有一个模糊的概念,对bitset对象里面的存储顺序不太清楚,于是写了一个小程序验证了一下,终于领悟到了这点小case。
首先声明一个bitset对象:
bitset<32> bitvec;
bitset类提供了几个构造函数,分别是:
bitset<n> b; //b有n位,每位都为0
bitset<n> b(u); //b是unsigned long型u的一个副本 bitset<n> b(s); //b是string对象s中含有的位串的副本 bitset<n> 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罢了。 最后附上我的实验代码:
=======================
|
|