在C ++中是否可以在不使用#define的情况下以另一种方式在C ++中定义BIT0,BIT1,BIT2?
#define BIT0 0x00000001
#define BIT1 0x00000002
#define BIT2 0x00000004
然后我接受同样的事情并从那些位中取出状态:
#define MOTOR_UP BIT0
#define MOTOR_DOWN BIT1
注意:我只使用32位,而不是64位。我也使用setBit(flagVariable, BIT)
(因此一个clrBit
宏来执行相反的操作)宏来设置位,然后比较是否使用按位运算符设置该位,例如
if (flagVariable & MOTOR_UP) {
// do something
clrBit(flagVariable, MOTOR_UP);
}
C ++中是否存在已包含这些位掩码的类型?
答案 0 :(得分:7)
您可以改为使用枚举:
enum {
BIT1 = 1,
BIT2 = 2,
BIT3 = 4,
...
};
答案 1 :(得分:6)
这是一种方式:
const int bit0 = (1<<0);
const int bit1 = (1<<1);
const int bit2 = (1<<2);
//...
const int motor_up = bit0;
const int motor_down = bit1;
答案 2 :(得分:6)
怎么样:
enum Bits
{
BIT0 = 0x00000001,
BIT1 = 0x00000004,
BIT2 = 0x00000008,
MOTOR_UP = BIT0,
MOTOR_DOWN = BIT1
};
答案 3 :(得分:6)
使用模板怎么样?
template <int BitN>
struct bit
{
static const int value = (1 << BitN);
}
你会这样使用它:
const int MOTOR_UP = bit<0>::value;
const int MOTOR_DOWN = bit<1>::value;
或者使用枚举:
enum
{
MOTOR_UP = bit<0>::value,
MOTOR_DOWN = bit<1>::value
}
答案 4 :(得分:5)
您可以改为使用函数:
#define BIT(n) (1<<(n))
* 已针对Macro Monster合规性进行了编辑
答案 5 :(得分:2)
我说结合tzaman's和Martin York's答案:
#define BIT(x) (1 << (x))
enum {
motor_up = BIT(0),
motor_down = BIT(1)
};
没有什么特别的理由可以使用愚蠢名称的一堆宏或枚举,例如BIT0
,BIT1
,...,BITn
。
并且枚举作为整数常量很有用 - 它们没有宏全局命名空间重写功能,并且它们在C和C ++中同样运行良好(const int
类型不适用)。
答案 6 :(得分:0)
你可能想要STL's std::bitset
。
答案 7 :(得分:-1)
使用bitfield union和structs。 (对于Billy:问题的解决方案是C ++代码。示例使用的是C ++ / CLI。)
union MotorControl
{
struct
{
int motorUp :1;
int motorDown :1;
};
struct
{
int all;
};
};
int main(array<System::String ^> ^args)
{
MotorControl mc;
mc.all = 0;
mc.motorDown = 1;
}
答案 8 :(得分:-1)
我稍微修改了马丁的answer:
enum Bits
{
BIT0 = 0x00000001,
BIT1 = BIT0 << 1,
BIT2 = BIT1 << 1,
MOTOR_UP = BIT0,
MOTOR_DOWN = BIT1
};
使用移位运算符可以使事情更加一致,如果你稍微跳过一点就很明显。