C Union - 显示一个字节的所有8位

时间:2016-04-16 14:43:43

标签: c bit-manipulation unions

我必须创建允许我从特定字节获取(并显示)每个位的联合。 这甚至有意义吗?我想我知道如何使用按位运算符,但不知道如何使用联合同样的效果。

4 个答案:

答案 0 :(得分:2)

建议使用按位运算。您可以将union和bit-fields组合起来提取位,但请注意,这是依赖于endianness的,这就是为什么不建议这样做的原因,这里有一个示例供您学习:

#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;
}

这应输出

0x41
01000001

答案 1 :(得分:1)

您可以使用包含8个一位位域的unit8_tstruct的并集。但是,即使这样可以访问各个位,您也不会知道它们是哪些位!这取决于编译器如何将位字段分配给基础字节,这可能取决于目标机器的字节顺序。

请参阅this SO Q&A

答案 2 :(得分:1)

自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))

使用位操作的优点是:

  1. 您不必担心字节序。
  2. 它看起来更短更清晰。

答案 3 :(得分:1)

您可以使用位字段和联合来执行此操作:

#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;
}

注意,在此实现中,第一位是低位