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

2019-08-20 06:57发布

这是为什么程序显示下面的输出?

#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检查。 但它也显示了同样的事情。 请帮忙。

Answer 1:

尽管外观上, 11111111是小数。 的二进制表示11111111 10101010011000101011000111 2。 在构造, std::bitset<8>充分利用了八个最低位显著: 11000111 2。

第一种情况是类似的,除了01100100是八进制(由于前导零)。 在二元表达了同样的数字是1001000000001000000 2。

来表示具有的值的位集的一种方式11111111 2std::bitset<8> b1(0xff)

另外,您也可以构建从二进制字符串一个bitset:

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


Answer 2:

按照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;
}

点击此处查看输出。



文章来源: Why is the std::bitset<8> variable unable to handle 11111111?