定义位0、位1、位2等,但不定义 < C++ >在C++中不需要使用“y定义”/< p>,可以用C++的另一种方式定义BIT0、BIT1、BIT2吗?

定义位0、位1、位2等,但不定义 < C++ >在C++中不需要使用“y定义”/< p>,可以用C++的另一种方式定义BIT0、BIT1、BIT2吗?,c++,bitmap,bit-manipulation,c-preprocessor,C++,Bitmap,Bit Manipulation,C Preprocessor,然后,我用同样的东西,用这些比特来表示状态: #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++

然后,我用同样的东西,用这些比特来表示状态:

#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++中已经包含了这些位掩码的类型?

,您可以使用一个函数代替:

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

#定义位(n)(1您可以使用枚举:

enum {
  BIT1 = 1,
  BIT2 = 2,
  BIT3 = 4,
  ...
};

你可能想要像这样的东西。

这里有一种方法:

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;
const int bit0=(1

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

    MOTOR_UP    = BIT0,
    MOTOR_DOWN  = BIT1
};

使用位域联合和结构(比利:问题的解决方案是C++代码。样本是使用C++ +CLI)< /P>

联合电机控制
{
结构
{
int motorUp:1;
int-motorDown:1;
};
结构
{
int all;
};
};
int main(数组^args)
{
电机控制;
mc.all=0;
mc.motorDown=1;
}

使用模板怎么样

template <int BitN>
struct bit
{
    static const int value = (1 << BitN);
}
模板
结构钻头
{
静态常量int值=(1我说组合并回答:

#定义位(x)(1我想修改一下马丁的:

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

    MOTOR_UP    = BIT0,
    MOTOR_DOWN  = BIT1
};
枚举位
{
位0=0x00000001,


BIT1=BIT0这个问题不是说没有定义吗?@Billy:“当然,但我想目的是避免必须手动定义32位,这很好。啊……如果这是他想要的,那么这个问题写得很糟糕。宏怪物说,“我需要更多的参数!”:
\define BIT(n)(1.§7.2/4说:“实现定义了使用哪种整数类型作为枚举的基础类型,但基础类型不得大于
int
,除非枚举器的值不能适合
int
无符号int
。”我现在把那个音符删除了。不要忘记你总是可以编辑你的答案来修复无效的事实。- 1:这不是C++。把它变成C++,我就去掉我的投票。哦,这也不是便携式的EndieWistar。我不会投票赞成,但我想我会提到它。不要听比利,这是C++代码。我一直在嵌入式C++项目中使用这个。使用硬件时(如电机控制)移植到其他的Endiad硬件通常不是问题。@ JYYN:不,是C++ + CLI.C++/CLI不是C++。你的代码与工会和结构是正确的。<代码>主< /C>是错误的。匿名结构不是有效的标准C++。BIT是一种坏的方式。你不能给每个位字段提供符号名。@ JYoung:你可以。在这里,我也不能给其他一半的答案指定符号名。至少在
位集
中,你不是在手动旋转位。我对你的编号方案很好奇——我知道位0是最低有效位,但为什么位1是第三位最低有效位,位2是第四位?要么你缺少0x00000002,要么你的数字非常不一致支架和混乱的实践。我很好奇为什么用宏定义。在C++代码中使用“代码> >定义< /CODE”是非常糟糕的做法。Stbit是一个宏,它设置位和Crbit清除了位。代码是从C移植很久以前的。在编译时该值是可用的,所以没有理由枚举不能工作。@格兰特·彼得斯:我在回答问题时过于谨慎,而没有使用编译器;)好吧,这有什么意义呢?比特::值并没有比它更具表现力(1@peterchen:与我的答案相比,这更适用于原始问题(同样适用于这里的大多数其他答案)尽管如此,我不同意这种说法,即它没有比原始表达更具表现力。只是“比特”一词的出现对不熟悉位元移位操作的人来说,它可以略微理解得更多。@编辑:我把这个代码发布给任何人,没有任何保证。这是过时的,因为现在的问题,OP刚刚做了一个TyPOSO BIT0,根据Eng+的C++规范变成了<代码> int >代码>它没有变成一个int。它在系统上表示为int。但这对您来说不会有任何区别。积分提升规则将根据使用上下文将其转换为正确的类型。
BIT0
实际上是
{}中的
int
,以及外部的
值。@Martin:在枚举中声明MOTOR\u UP或MOTOR\u DOWN有什么好处吗?@Changeling:它将所有位标志保留在一个位置,从而使维护更容易。
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
}
#define BIT(x) (1 << (x))

enum {
    motor_up = BIT(0),
    motor_down = BIT(1)
};
enum Bits
{
    BIT0    = 0x00000001,
    BIT1    = BIT0 << 1, 
    BIT2    = BIT1 << 1,

    MOTOR_UP    = BIT0,
    MOTOR_DOWN  = BIT1
};