C Union-显示一个字节的所有8位
我必须创建一个union,它允许我获取并显示特定字节中的每一位。 这有意义吗?我想我知道如何使用位运算符实现这一点,但不知道如何使用并集实现同样的效果 可以使用unit8\t和包含8个一位位位字段的结构的并集。然而,即使这将允许您访问单个位,您也不知道它们是哪些位!这将取决于编译器如何将位字段分配给基础字节,这可能取决于目标机器的端号 请参阅。您可以使用unit8\u t和包含8个一位位字段的结构的并集。然而,即使这将允许您访问单个位,您也不知道它们是哪些位!这将取决于编译器如何将位字段分配给基础字节,这可能取决于目标机器的端号C Union-显示一个字节的所有8位,c,bit-manipulation,unions,C,Bit Manipulation,Unions,我必须创建一个union,它允许我获取并显示特定字节中的每一位。 这有意义吗?我想我知道如何使用位运算符实现这一点,但不知道如何使用并集实现同样的效果 可以使用unit8\t和包含8个一位位位字段的结构的并集。然而,即使这将允许您访问单个位,您也不知道它们是哪些位!这将取决于编译器如何将位字段分配给基础字节,这可能取决于目标机器的端号 请参阅。您可以使用unit8\u t和包含8个一位位字段的结构的并集。然而,即使这将允许您访问单个位,您也不知道它们是哪些位!这将取决于编译器如何将位字段分配给基
请参阅。建议使用位运算。您也可以组合union和bit字段来提取位,但请注意,这取决于尾数,因此不建议使用此方法,但这里有一个示例供您学习:
#include <stdio.h>
#include <string.h>
union Bits {
char b;
struct bits {
#ifdef LITTLE_ENDIAN
unsigned int b0: 1;
unsigned int b1: 1;
unsigned int b2: 1;
unsigned int b3: 1;
unsigned int b4: 1;
unsigned int b5: 1;
unsigned int b6: 1;
unsigned int b7: 1;
#else
// reverse the order of the bit fields.
#endif
} bits;
};
int main(void) {
char a = 'A';
union Bits b;
b.b = a;
printf("0x%x\n", a);
printf("%d%d%d%d%d%d%d%d\n", b.bits.b7, b.bits.b6, b.bits.b5, b.bits.b4, b.bits.b3, b.bits.b2, b.bits.b1, b.bits.b0);
return 0;
}
建议使用位操作。您也可以组合union和bit字段来提取位,但请注意,这取决于尾数,因此不建议使用此方法,但这里有一个示例供您学习:
#include <stdio.h>
#include <string.h>
union Bits {
char b;
struct bits {
#ifdef LITTLE_ENDIAN
unsigned int b0: 1;
unsigned int b1: 1;
unsigned int b2: 1;
unsigned int b3: 1;
unsigned int b4: 1;
unsigned int b5: 1;
unsigned int b6: 1;
unsigned int b7: 1;
#else
// reverse the order of the bit fields.
#endif
} bits;
};
int main(void) {
char a = 'A';
union Bits b;
b.b = a;
printf("0x%x\n", a);
printf("%d%d%d%d%d%d%d%d\n", b.bits.b7, b.bits.b6, b.bits.b5, b.bits.b4, b.bits.b3, b.bits.b2, b.bits.b1, b.bits.b0);
return 0;
}
自C99以来,我们拥有匿名结构和联合,使事情变得更简单:
#include <stdio.h>
#include <stdbool.h>
#include <inttypes.h>
union disByte
{
uint8_t byte;
// Assuming little endian
struct {
bool b0: 1;
bool b1: 1;
bool b2: 1;
bool b3: 1;
bool b4: 1;
bool b5: 1;
bool b6: 1;
bool b7: 1;
};
};
int main()
{
union disByte foo;
foo.byte = 42;
printf("%d %d %d %d %d %d %d %d\n", foo.b0, foo.b1, foo.b2, foo.b3, foo.b4, foo.b5, foo.b6, foo.b7);
}
但是,位操纵通常是首选的,因为您的问题已被标记为位操纵
#define XTH_BIT_OF(NUM, X) (bool)(NUM & (1U << X))
使用位操作的优点是:
你不需要担心持久性。
它看起来更短更清晰。
自C99以来,我们拥有匿名结构和联合,使事情变得更简单:
#include <stdio.h>
#include <stdbool.h>
#include <inttypes.h>
union disByte
{
uint8_t byte;
// Assuming little endian
struct {
bool b0: 1;
bool b1: 1;
bool b2: 1;
bool b3: 1;
bool b4: 1;
bool b5: 1;
bool b6: 1;
bool b7: 1;
};
};
int main()
{
union disByte foo;
foo.byte = 42;
printf("%d %d %d %d %d %d %d %d\n", foo.b0, foo.b1, foo.b2, foo.b3, foo.b4, foo.b5, foo.b6, foo.b7);
}
但是,位操纵通常是首选的,因为您的问题已被标记为位操纵
#define XTH_BIT_OF(NUM, X) (bool)(NUM & (1U << X))
使用位操作的优点是:
你不需要担心持久性。
它看起来更短更清晰。
可以使用位字段和并集执行以下操作:
#include <stdio.h>
typedef union {
struct {
unsigned int:0;
unsigned int firstBit : 1;
unsigned int secondBit : 1;
unsigned int thirdBit : 1;
unsigned int fourthBit : 1;
unsigned int fifthBit : 1;
unsigned int sixthBit : 1;
unsigned int seventhBit : 1;
unsigned int eigthBit : 1;
};
int raw;
} bitsOfByte;
int main()
{
bitsOfByte dt;
dt.raw = 254;
printf("Bits are %d/%d/%d/%d/%d/%d/%d/%d", dt.firstBit, dt.secondBit, dt.thirdBit, dt.fourthBit, dt.fifthBit, dt.sixthBit, dt.seventhBit, dt.eigthBit);
return 0;
}
请注意,在此实现中,第一位是较低的位您可以使用位字段和并集这样做:
#include <stdio.h>
typedef union {
struct {
unsigned int:0;
unsigned int firstBit : 1;
unsigned int secondBit : 1;
unsigned int thirdBit : 1;
unsigned int fourthBit : 1;
unsigned int fifthBit : 1;
unsigned int sixthBit : 1;
unsigned int seventhBit : 1;
unsigned int eigthBit : 1;
};
int raw;
} bitsOfByte;
int main()
{
bitsOfByte dt;
dt.raw = 254;
printf("Bits are %d/%d/%d/%d/%d/%d/%d/%d", dt.firstBit, dt.secondBit, dt.thirdBit, dt.fourthBit, dt.fifthBit, dt.sixthBit, dt.seventhBit, dt.eigthBit);
return 0;
}
请注意,在这个实现中,第一位是低位您是指位字段吗?联合不支持它。使用位运算符有什么错?你是指位域吗?联合不支持它。使用位运算符有什么问题吗?这是针对C99的。这是针对C99No的。您不能说明将使用哪个顺序位字段。位字段的顺序由实现定义。根据6.7.2.1结构和联合规范第11段:。。。单元内位字段的分配顺序——从高阶到低阶或从低阶到高阶由实现定义。。。它是实现定义的,这就是为什么我说它取决于端性而不是可移植性,我从来没有说过可以声明位字段的顺序这不仅仅取决于endianness——不同的编译器可以并且确实会对位字段进行不同的处理。所以你不能真正知道哪一位是哪一位。有些人甚至把它搞砸了:你是对的,不应该按位域的顺序回复,标准没有这样的保证。如果unsigned int,我写的是unsigned char,它对我有效。否。您不能说明将使用哪个顺序位字段。位字段的顺序由实现定义。根据6.7.2.1结构和联合规范第11段:。。。单元内位字段的分配顺序——从高阶到低阶或从低阶到高阶由实现定义。。。它是实现定义的,这就是为什么我说它取决于端性而不是可移植性,我从来没有说过可以声明位字段的顺序这不仅仅取决于endianness——不同的编译器可以并且确实会对位字段进行不同的处理。所以你不能真正知道哪一位是哪一位。有些人甚至把它搞砸了:你是对的,一个人不应该回复位域的顺序,标准没有这样的保证。如果unsigned int对我有效,我写了unsigned char。你不会知道它们是哪位的!谢谢你指出这一点。你不会知道它们是哪一部分的!谢谢你指出这一点。