Определить BIT0, BIT1, BIT2 и т. Д. Без #define - PullRequest
2 голосов
/ 08 июля 2010

Возможно ли в C ++ определять BIT0, BIT1, BIT2 другим способом в C ++ без использования #define?

#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 ]

7 голосов
/ 08 июля 2010

Вместо этого вы можете использовать enum:

enum {
  BIT1 = 1,
  BIT2 = 2,
  BIT3 = 4,
  ...
};
6 голосов
/ 08 июля 2010

Как насчет использования шаблона?

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
}
6 голосов
/ 08 июля 2010

Как насчет:

enum Bits
{
    BIT0    = 0x00000001,
    BIT1    = 0x00000004,
    BIT2    = 0x00000008,

    MOTOR_UP    = BIT0,
    MOTOR_DOWN  = BIT1
};
6 голосов
/ 08 июля 2010

Вот один из способов:

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;
5 голосов
/ 08 июля 2010

Вместо этого можно использовать функцию:

#define BIT(n) (1<<(n))

* отредактировано для соответствия требованиям Macro Monster

2 голосов
/ 08 июля 2010

Я говорю: объедините ответы Цамана и Мартина Йорка:

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

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

Нет особой причины для множества макросов или перечислений с глупыми именами, такими как BIT0, BIT1, ..., BITn.

И перечисления прекрасно работают как интегральные константы - они не имеют макроподобных возможностей для сжатия пространства имен и одинаково хорошо работают в C и C ++ (что не верно для типов const int).

0 голосов
/ 08 июля 2010

Я бы немного изменил ответ Мартина :

enum Bits
{
    BIT0    = 0x00000001,
    BIT1    = BIT0 << 1, 
    BIT2    = BIT1 << 1,

    MOTOR_UP    = BIT0,
    MOTOR_DOWN  = BIT1
};

Использование операторов сдвига делает вещи немного более последовательными и делает очевидным, если вы пропустите немного.

0 голосов
/ 08 июля 2010

Используйте объединение битовых полей и структуры.(Для Билли. Решением проблемы является код 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;
}
0 голосов
/ 08 июля 2010

Вы, вероятно, хотите что-то вроде STL std::bitset.

...