2

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

#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

4

4 回答 4

2

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

#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 进行比较就足够了(没有位掩码)。如果您需要一种模式通用解决方案来检查特定位,我将保留位掩码方法。

于 2010-12-23T00:54:13.407 回答
1
if( ~bits & (BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6) == (BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6))

关于速度(BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6)实际上被编译为常数,并且只有很少的操作(如 2)如果 - 一个 NOR 和一个比较(我不确定 x386 是否支持 NOR,但我认为确实如此)

于 2010-12-23T00:34:01.210 回答
1

如果我正确阅读了您的条件(根据@user547710 使用更正的括号),您将检查您的所有位是否都已设置,而不是零。

无论如何,您可以定义一个掩码,其中 1-6 位设置得更紧凑(1u << 6) - 1。这是编译时常量表达式,因此您不必担心额外的计算时间。我会做:

const unsigned char bitmask6 = 1u << 6) - 1;

if ((bits & bitmask6) == bitmask6)
于 2010-12-23T15:50:09.603 回答
0

虽然这只是一个注释,但运算符==的优先级高于&, 逻辑 - 并且应该用括号括起来:

if((a & b) == c)

我解释这是提问者的意图。

(我认为这应该只是作为评论发布,但似乎我无法发表评论)

于 2010-12-23T12:37:46.017 回答