本文有待更正,请参看另一篇C++笔记- 枚举类型与按位与或_qq_43058397的博客-CSDN博客
char占用8个二进制位,以按位或的方式可一次最多传入8个不同参数。int占用32个二进制位,最多可传入32个不同参数。这里以int为例。
进制在线转换进制转换 - 在线工具
用法简要说明一下:
因为要以按位或的方式进行unsigned int传参,所以把32个0中的任意一个设为1,就可得到一个Options项,一共可得到32个。
如下图,把倒数第四位设为1就可得到示例中常量OPTIONS_FOUR的16进制unsigned int值8。
该示例创建于QT平台,如若是其它平台,需要替换QString qstr = QString::number(op,2); int len = qstr.length();这两行代码中QString字符串类型以及number()函数和length()函数,两个函数的作用分别是:将int转换为二进制字符串、得到字符串长度。
示例源码:
#include <iostream>
using namespace std;
using Options = const unsigned int;//Options 选项
Options OPTIONS_ONE = 0x00000001;//32 表示int所占用的二进制位(int占用4字节共32位)中的第32位为1, 其余全为0, 以下类同。
Options OPTIONS_TWO = 0x00000002;//31
Options OPTIONS_THREE = 0x00000004;//30
Options OPTIONS_FOUR = 0x00000008;//29
//Options类型最多可创建32项
//每项所对应的16进制的unsigned int值可利用在线转换工具从二进制转16进制得到
void CinOptions(Options op)//按位或选项分解 代入条目最高支持32个
{
QString qstr = QString::number(op,2);
int len = qstr.length();
for(int i = len - 1, j = 0; i >= 0 ; i--,j++)
{
if(qstr[i] == '1')
{
switch (32 - j) {
case 32:
cout << "Options one." << endl;
break;
case 31:
cout << "Options two." << endl;
break;
case 30:
cout << "Options three." << endl;
break;
case 29:
cout << "Options four." << endl;
break;
default:
break;
}
}
}
}
void main()
{
cout << "The \"OPTIONS_THREE\" is" << endl;
CinOptions(OPTIONS_THREE);
cout << endl;
cout << "The \"OPTIONS_TWO | OPTIONS_FOUR\" is" << endl;
CinOptions(OPTIONS_TWO | OPTIONS_FOUR);
cout << endl;
cout << "The \"OPTIONS_ONE | OPTIONS_TWO | OPTIONS_THREE | OPTIONS_FOUR\" is" << endl;
CinOptions(OPTIONS_ONE | OPTIONS_TWO | OPTIONS_THREE | OPTIONS_FOUR);
}