没有#define定义BIT0,BIT1,BIT2等

时间:2010-07-07 23:57:34

标签: c++ bitmap bit-manipulation c-preprocessor

在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 ++中是否存在已包含这些位掩码的类型?

9 个答案:

答案 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'sMartin York's答案:

#define BIT(x) (1 << (x))

enum {
    motor_up = BIT(0),
    motor_down = BIT(1)
};

没有什么特别的理由可以使用愚蠢名称的一堆宏或枚举,例如BIT0BIT1,...,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
};

使用移位运算符可以使事情更加一致,如果你稍微跳过一点就很明显。