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

Why is the std::bitset<8> variable unable to handle 11111111?

本文关键字:处理 变量 11111111 std bitset lt 为什么 gt      更新时间:2023-10-16

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

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

尽管看起来,11111111是十进制的。11111111 10的二进制表示为101010011000101011000111 2。构造后,std::bitset<8>11000111 2的最小8位。

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

表示值为11111111 2的bitset的一种方法是std::bitset<8> b1(0xff)

或者,您可以从二进制字符串构造bitset:

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

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

点击这里查看输出