C++ 位域测试

标签 c++ bit

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

#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++ 位域测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4514958/

相关文章:

c++ - 回文和镜像字符串

c++ - 无法通过 get 方法编辑私有(private)变量(必须是可修改的左值)

binary - 对人口计数算法有所了解

x86 - Bit Hack 获取位变化的位置

c - 在十六进制数中设置一个位

c# - 枚举的位操作

c++ - 在笛卡尔平面上旋转 X、Y 坐标的问题

c++ - 从另一个对话框更新对话框时出现问题

c++ - 有没有办法为模板化函数声明类型名?

c - macOS 10.12 中 C 语言的位右移与 Ubuntu 16.04 不同