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 进行了检查。但它也表明了同样的事情。请帮忙。

4

2 回答 2

48

尽管有外观,但11111111它是十进制的。1111111110的二进制表示是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"));
于 2013-04-08T10:20:17.280 回答
7

根据 NPE 的回答,您正在使用 构建bitsetunsigned long而不是像您期望的那样使用位。构造它的另一种方法,使您能够指定位,是使用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;
}

单击此处查看输出。

于 2013-04-08T10:26:11.993 回答