c - C 中的位域操作

标签 c bit-manipulation

在 C 中测试和设置整数中的各个位的经典问题可能是最常见的中级编程技能之一。您可以使用简单的位掩码进行设置和测试,例如

unsigned int mask = 1<<11;

if (value & mask) {....} // Test for the bit
value |= mask;    // set the bit
value &= ~mask;   // clear the bit

interesting blog post认为这很容易出错,难以维护,而且实践不佳。 C 语言本身提供类型安全和可移植的位级访问:

typedef unsigned int boolean_t;
#define FALSE 0
#define TRUE !FALSE
typedef union {
        struct {
                boolean_t user:1;
                boolean_t zero:1;
                boolean_t force:1;
                int :28;                /* unused */
                boolean_t compat:1;     /* bit 31 */
        };
        int raw;
} flags_t;

int
create_object(flags_t flags)
{
        boolean_t is_compat = flags.compat;

        if (is_compat)
                flags.force = FALSE;

        if (flags.force) {
                [...]
        }
        [...]
}

但这让我畏缩

我和我的同事就此进行的有趣争论仍未解决。两种样式都有效,我认为经典的位掩码方法简单、安全且清晰。我的同事同意这很常见也很简单,但位域 union 方法值得多写几行,以使其更便携、更安全。

双方还有更多的争论吗?特别是是否存在一些可能的故障,也许是字节序,位掩码方法可能会错过但结构方法是安全的?

最佳答案

位域并不像您想象的那样可移植,因为“C 不保证机器字内字段的顺序”(The C book)

忽略这一点,正确使用,这两种方法都是安全的。这两种方法还允许对整数变量进行符号访问。您可以争辩说位域方法更容易编写,但它也意味着需要审查更多代码。

关于c - C 中的位域操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1044654/

相关文章:

javascript - 位运算的意义何在(Espruino)

c - 了解 GCC 内联汇编函数

c - 编译问题

c++ - 文件读写的同时逐行读取文件

java - Java中的按位乘法和加法

将 14 位转换为 8 位并返回

php - 对可变位宽二进制 block 中的十进制值进行编码/解码

c - 结构中数组的初始化

c - 在我的 C 代码中收到 2 个错误,指出 “undefined reference”

c++ - 如何用位运算代替取模和除法运算?