C 中的位域 - 对齐与初始化
Bitfields in C - aligning vs initializing
作为位域的新手,我需要一些关于我在网上看到的各种例子的建议。我想使用位域而不是位掩码来提高可读性,并在以后为新的 ppl 简化维护。
这是声明位域的常用方法:
typedef enum
{
unsigned int x: 1;
unsigned int y: 1;
}statusBits1;
到目前为止一切顺利,然后我看到了:
typedef enum
{
unsigned int x = 1 << 0,
unsigned int y = 1 << 1
}statusBits2;
在我的学习中,我相信这会为任何 statusBits2 数据类型设置默认值。这是否也像 statusBits1 一样将 x 和 y 的大小设置为 1 位字段?
两者的结合是我正在寻找的。
提前致谢。
编辑:
谢谢你的回答!你强迫我重读我一直在学习的东西。我正在混合各种帖子中关于位域和位掩码的信息!
即这些:
Declaring and checking/comparing (bitmask-)enums in Objective-C
bitwise indexing in C?
http://forum.codecall.net/topic/56591-bit-fields-flags-tutorial-with-example/
我在 C#/C++ 工作了几年后回到了 C,并重新学习了 bit fiddling。
StatusBits2
根本不包含位域。它包含两个 unsigned ints
,默认值为 1 和 2。但是,它也是无效的 C。位字段需要 struct
而不是 enum
。
您的第一个示例不表示位域。这将是 struct
而不是 enum
。
在较新的 C++ 中,您可以为结构成员定义默认值:
typedef struct
{
unsigned int x = 1 << 0; /* Default value 1 << 0 = 1 */
unsigned int y = 1 << 1; /* Default value 1 << 1 = 2 */
} statusBits2;
但是,这在标准 C 和较旧的 C++ 标准中是不可能的,并且不会设置字段宽度。您还可以设置字段宽度:
typedef struct
{
unsigned int x : 1; /* Field width 1 bit, no default */
unsigned int y : 1; /* Field width 1 bit, no default */
} statusBits2;
我不知道有什么方法可以在 C 和 C++ 中定义默认值和字段宽度。
让我解释一下你的第二个例子的意思(正如你写的那样,enum
):
你的第二个代码almost表示一个枚举。这是一个整数类型,可以容纳 one 个表示值。例如:
typedef enum
{
fish = 3,
gorilla = 7,
rabbit = 9
} animal_t;
是一种类型,可以具有值 3、7 和 9 中的一个,您可以通过它们的名称使用这些值,例如:
animal_t my_animal = fish;
(事实上它也可以保存其他整数值)。
枚举和结构都有助于使您的代码更清晰、更具描述性,但不要将它们混为一谈!
None 个示例是有效的 C 或 C++ 代码。
作为位域的新手,我需要一些关于我在网上看到的各种例子的建议。我想使用位域而不是位掩码来提高可读性,并在以后为新的 ppl 简化维护。
这是声明位域的常用方法:
typedef enum
{
unsigned int x: 1;
unsigned int y: 1;
}statusBits1;
到目前为止一切顺利,然后我看到了:
typedef enum
{
unsigned int x = 1 << 0,
unsigned int y = 1 << 1
}statusBits2;
在我的学习中,我相信这会为任何 statusBits2 数据类型设置默认值。这是否也像 statusBits1 一样将 x 和 y 的大小设置为 1 位字段? 两者的结合是我正在寻找的。
提前致谢。
编辑: 谢谢你的回答!你强迫我重读我一直在学习的东西。我正在混合各种帖子中关于位域和位掩码的信息!
即这些:
Declaring and checking/comparing (bitmask-)enums in Objective-C
bitwise indexing in C?
http://forum.codecall.net/topic/56591-bit-fields-flags-tutorial-with-example/
我在 C#/C++ 工作了几年后回到了 C,并重新学习了 bit fiddling。
StatusBits2
根本不包含位域。它包含两个 unsigned ints
,默认值为 1 和 2。但是,它也是无效的 C。位字段需要 struct
而不是 enum
。
您的第一个示例不表示位域。这将是 struct
而不是 enum
。
在较新的 C++ 中,您可以为结构成员定义默认值:
typedef struct
{
unsigned int x = 1 << 0; /* Default value 1 << 0 = 1 */
unsigned int y = 1 << 1; /* Default value 1 << 1 = 2 */
} statusBits2;
但是,这在标准 C 和较旧的 C++ 标准中是不可能的,并且不会设置字段宽度。您还可以设置字段宽度:
typedef struct
{
unsigned int x : 1; /* Field width 1 bit, no default */
unsigned int y : 1; /* Field width 1 bit, no default */
} statusBits2;
我不知道有什么方法可以在 C 和 C++ 中定义默认值和字段宽度。
让我解释一下你的第二个例子的意思(正如你写的那样,enum
):
你的第二个代码almost表示一个枚举。这是一个整数类型,可以容纳 one 个表示值。例如:
typedef enum
{
fish = 3,
gorilla = 7,
rabbit = 9
} animal_t;
是一种类型,可以具有值 3、7 和 9 中的一个,您可以通过它们的名称使用这些值,例如:
animal_t my_animal = fish;
(事实上它也可以保存其他整数值)。
枚举和结构都有助于使您的代码更清晰、更具描述性,但不要将它们混为一谈!
None 个示例是有效的 C 或 C++ 代码。