gpt4 book ai didi

c - 如何检查在 C 位域中设置的单个域

转载 作者:太空宇宙 更新时间:2023-11-04 02:42:42 25 4
gpt4 key购买 nike

我有以下 union 风格 - 在接口(interface)中定义,不易更改。

我想检查 foo 是否是唯一被设置的字段。并且不想通过逐项列出所有其他字段来做到这一点。

所以我的直接想法是构造一个掩码,但是位域会尽力隐藏命名字段的位置等细节。

我想不出有什么比创建一个只有一个字段集的变量然后反转原始字段更好的了。有更简洁的解决方案吗?

typedef union    struct {
unsigned char user:1;
unsigned char zero:1;
unsigned char foo:1;
unsigned char bar:1;
unsigned char blah:1;
unsigned char unused:3;
};
unsigned char raw;
} flags_t;

最佳答案

按位异或取反你想要的:

  11011111
^ 00100000
= 11111111

然后只需检查该值 == 255。可以通过使用您自己的结构来通过将 bar->foo = 0 和其他所有内容设置为 1 来构建否定来使其干净。

编辑:稍微阐述一下,因为当你要求的时候不漂亮让我感到难过:

struct {
unsigned char bad:1;
unsigned char bad:1;

unsigned char foo;

unsigned char other:1;
unsigned char bad:1;
unsigned char things:3;
} state_checker;

int some_checking_function(flags_t possible_foo) {
result = possible_foo ^ state_checker;
result = !(result - 255u);
return result;
}

理想情况下,您甚至可以创建一个常量,该常量使用与您正在检查的值相同的结构,以确保在编译时不会发生任何异常情况,但这是基本思想。

关于c - 如何检查在 C 位域中设置的单个域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30226125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com