为啥 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 是十进制的。 1111111110 的二进制表示是 1010100110001010110001112。在构造时,std::bitset&lt;8&gt; 取其中的 8 个最低有效位:110001112

第一种情况类似,除了 01100100 是八进制(由于前导零)。以二进制表示的相同数字是10010000000010000002

111111112 表示位集的一种方法是std::bitset&lt;8&gt; 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?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 std::bitset 的位顺序相反? [复制]

为啥带有 unsigned long long 参数的 std::bitset 构造函数未标记为显式?

std::bitset<N> 实现导致大小被偷听

如何编写适用于 32 位和 64 位的 std::bitset 模板

std::bitset<N>::count vs __builtin_popcount

std::bitset<N>::count vs __builtin_popcount