如果我有一些像这样的枚举
typedef enum {
AN_TRISTATE_0,
AN_TRISTATE_1,
AN_NOTHING,
AN_MOTOR_1,
AN_MOTOR_2,
AN_MOTOR_3,
AN_SENSOR_1,
AN_SENSOR_2,
AN_SENSOR_3,
AN_SENSOR_4,
AN_SENSOR_5
} adc_pin_func_t;
Run Code Online (Sandbox Code Playgroud)
和
adc_pin_func_t a_particular_pin = ...
Run Code Online (Sandbox Code Playgroud)
是否有可能检查引脚是否属于特定组,例如引脚是其中的一部分AN_MOTOR
或部分AN_SENSOR
,而不是必须检查每个可能组中的每个项目.
或者除了使用枚举之外,还有更有效的方法吗?
提前致谢
tro*_*foe 22
您可以为每个组创建掩码:
typedef enum {
AN_TRISTATE_0 = 0x00001,
AN_TRISTATE_1 = 0x00002,
AN_TRISTATE_MASK = 0x0000f,
AN_NOTHING = 0x00010, // Should this be 0x00000 ?
AN_MOTOR_1 = 0x00100,
AN_MOTOR_2 = 0x00200,
AN_MOTOR_3 = 0x00400,
AN_MOTOR_MASK = 0x00f00,
AN_SENSOR_1 = 0x01000,
AN_SENSOR_2 = 0x02000,
AN_SENSOR_3 = 0x04000,
AN_SENSOR_4 = 0x08000,
AN_SENSOR_5 = 0x10000,
AN_SENSOR_MASK = 0xff000
} adc_pin_func_t;
Run Code Online (Sandbox Code Playgroud)
然后使用&
运算符简单地针对掩码测试组:
if (a_particular_pin & AN_SENSOR_MASK)
{
// it's a sensor pin
}
else if (a_particular_pin & AN_MOTOR_MASK)
{
// it's a motor pin
}
Run Code Online (Sandbox Code Playgroud)
编辑:正如其他人建议使用范围,那么您可能可以为测试创建一个宏,这将允许您更改测试的执行方式,而无需更改代码(总是一件好事):
#define IS_AN_SENSOR(x) (((x) & AN_SENSOR_MASK) != 0)
#define IS_AN_MOTOR(x) (((x) & AN_MOTOR_MASK) != 0)
// etc.
Run Code Online (Sandbox Code Playgroud)
然后测试成为:
if (IS_AN_SENSOR(a_particular_pin))
{
// it's a sensor pin
}
else if (IS_AN_MOTOR(a_particular_pin))
{
// it's a motor pin
}
// etc
Run Code Online (Sandbox Code Playgroud)
如果您需要更改为使用范围,则只需要更改宏(并且您显然需要定义范围最小值/最大值):
#define IS_AN_SENSOR(x) ((x) >= AN_SENSOR_START && (x) <= AN_SENSOR_END)
// etc
Run Code Online (Sandbox Code Playgroud)