为什么 std::bitset<8> 变量无法处理11111111?
Why is the std::bitset<8> variable unable to handle 11111111?
为什么这个程序显示以下输出?
#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;
}
点击这里查看输出
相关文章:
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 如何处理非default_constructible tyname 变量
- 在通知提升间处理条件变量时未按住锁会导致问题
- Visual C++: MSVC vs. GCC+CLANG: 处理 lambda 捕获类成员变量,正确的方法是什么?
- C++预处理会生成变量成员、资源库和映射
- 如何处理冲突的函数和变量名称?
- C++单个变量来处理来自用户的多个类
- C++11如何在1个线程中使用条件变量处理2个线程安全队列
- 当线程处理不同的类时,应该在哪里声明条件变量、互斥对象
- 当使用lambda进行变量的复杂初始化时,如何处理从内部抛出的lambda外部异常
- 多线程处理中的静态成员变量
- 如何使用模板处理多类型变量?
- 在调用进程的上下文中通过 win32 执行批处理,从而保留环境变量
- 如何处理参数中的基类和指针变量
- 如何获取函数以在 Main() 中重新处理变量
- 从C++输入中收集数据时,是否有更有效的方法可以处理变量
- Visual Studio 2015-用GIT分支和GIT提交定义预处理变量
- 在8位块中处理变量的好方法是什么?
- 在静态初始化列表之前预处理变量
- GCC如何处理变量重定义