为什么std::bitset<8>变量无法处理11111111?

14

为什么这个程序会显示以下的输出?

#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进行了检查。但它也显示出了同样的问题。请帮忙。


2
使用0xff可以修复它(如果您的编译器支持,则可以使用0b11111111) - ratchet freak
如果它能像这样在十进制中进行二进制初始化,那就很不错了。 - Inverse
2个回答

48

尽管看起来是这样,但 11111111 是十进制的。二进制表示为 1010100110001010110001112。在构造时,std::bitset<8> 取其中最不重要的八个位:110001112

第一个例子类似,只不过 01100100 是八进制(因为前导零)。相同的数字用二进制表示为 10010000000010000002

表示值为 111111112 的位集合的一种方法是使用 std::bitset<8> b1(0xff)

或者,您可以从二进制字符串构造一个位集合:

std::bitset<8> b1(std::string("01100100"));
std::bitset<8> b2(std::string("11111111"));

7
根据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;
}

点击此处 查看输出结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接