有没有比这更紧凑的方式来比较我的数据(我知道的唯一方法):

#define BIT1 1
#define BIT2 2
#define BIT3 4
#define BIT4 8
#define BIT5 16
#define BIT6 32

// I declare this somewhere in a structure
unsigned char bits: 6;

// I want all of them to be 0 at first (000000)
bits = 0;

/* I do some bite setting here */

// I only want to know if the state of my bits == 000000
if(bits & (BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6) == (BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6))
{
    // All kinds of nasty stuff
}

我以为是bits & 0x00 == 0x00

最佳答案

如果您想要紧凑(如注释中所示)而不是快速,为什么不这样做:

#define BIT1 0x01
#define BIT2 0x02
#define BIT3 0x04
#define BIT4 0x08
#define BIT5 0x10
#define BIT6 0x20
#define BITS1THRU4 (BIT1|BIT2|BIT3|BIT4)
// or #define BITS1THRU6 0x0f

// I declare this somewhere in a structure
unsigned char bits: 6;

// I want all of them to be 0 at first (000000)
bits = 0;

/* I do some bit setting here */

// I only want to know if the state of my first four bits == 0000
if(bits & BITS1THRU4 == 0) ...

因为您的原始代码无论如何都会变成该常量,所以它可能不会更快,但是它可能更具可读性(这通常是这样做的一个很好的理由)。

如果您需要其他变体,只需定义它们即可。如果它们太多(63个定义,如果您全部使用它们,可能会偏高一点),我将开始考虑另一种解决方案。

但是,老实说,除非您要对定义使用更有意义的名称,否则我将放弃它们。对于了解位模式的人来说,名字BIT3确实没有为0x04添加任何内容。如果是类似UART_READ_READY_BIT之类的东西,那会很好,但是您所拥有的只是比以下要好:
#define THREE 3

(无意冒犯,我只是指出我的观点)。我只是算出位模式并将它们直接放在代码中(在您的情况下,位1至6为0x3f)。

而且,顺便说一句,对于您的特殊情况,我认为bits无论如何都只是那六个位,因此您可能会发现足以将它与0(没有位掩码)进行比较。如果您想要一种模式通用解决方案来检查特定位,则我保留了位屏蔽方法。

关于c++ - C++位域测试,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4514958/

10-11 23:23