定义位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
};