为啥 std::bitset<8> 变量无法处理 11111111?
Posted
技术标签:
【中文标题】为啥 std::bitset<8> 变量无法处理 11111111?【英文标题】:Why is the std::bitset<8> variable unable to handle 11111111?为什么 std::bitset<8> 变量无法处理 11111111? 【发布时间】:2013-03-30 09:18:13 【问题描述】:为什么这个程序显示以下输出?
#include <bitset>
...
std::bitset<8> b1(01100100); std::cout<<b1<<std::endl;
std::bitset<8> b2(11111111); std::cout<<b2<<std::endl; //see, this variable
//has been assigned
//the value 11111111
//whereas, during
//execution, it takes
//the value 11000111
std::cout << "b1 & b2: " << (b1 & b2) << '\n';
std::cout << "b1 | b2: " << (b1 | b2) << '\n';
std::cout << "b1 ^ b2: " << (b1 ^ b2) << '\n';
这是输出:
01000000
11000111
b1 & b2: 01000000
b1 | b2: 11000111
b1 ^ b2: 10000111
首先,我认为头文件有问题(我使用的是 MinGW)所以我 使用 MSVCC 检查。但它也表明了同样的事情。请帮忙。
【问题讨论】:
使用 0xff 会修复它(或者 0b11111111 是你的编译器支持它) 如果它像这样以十进制进行二进制初始化可能会有点整洁 【参考方案1】:尽管看起来,11111111
是十进制的。 11111111
10 的二进制表示是 101010011000101011000111
2。在构造时,std::bitset<8>
取其中的 8 个最低有效位:11000111
2。
第一种情况类似,除了 01100100
是八进制(由于前导零)。以二进制表示的相同数字是1001000000001000000
2。
用11111111
2 表示位集的一种方法是std::bitset<8> b1(0xff)
。
或者,您可以从二进制字符串构造位集:
std::bitset<8> b1(std::string("01100100"));
std::bitset<8> b2(std::string("11111111"));
【讨论】:
一个快速而伟大的答案!谢谢!明白了!【参考方案2】:根据 NPE 的回答,您正在使用 unsigned long
构建 bitset
,而不是像您期望的那样使用位。构造它的另一种方法是使用string
构造函数来指定位,如下所示:
#include <bitset>
#include <cstdio>
#include <iostream>
int main()
std::bitset<8> b1(std::string("01100100")); std::cout<<b1<<std::endl;
std::bitset<8> b2(std::string("11111111")); std::cout<<b2<<std::endl;
std::cout << "b1 & b2: " << (b1 & b2) << '\n';
std::cout << "b1 | b2: " << (b1 | b2) << '\n';
std::cout << "b1 ^ b2: " << (b1 ^ b2) << '\n';
getchar();
return 0;
Click here 查看输出。
【讨论】:
以上是关于为啥 std::bitset<8> 变量无法处理 11111111?的主要内容,如果未能解决你的问题,请参考以下文章
为啥带有 unsigned long long 参数的 std::bitset 构造函数未标记为显式?
如何编写适用于 32 位和 64 位的 std::bitset 模板