如何获取unsigned char的每一位的值?

How to get the value of every bit of an unsigned char?

在 c 中,我知道 unsigned char 的大小为 1 字节(= 1 个八位字节 = 8 位),而且我知道unsigned char 实际上是一个介于 0 和 255 之间的整数值,现在如果我有以下 unsigned char 变量:

unsigned char c = 255; //(this value can be any value from 0 to 255)


我怎样才能得到一个 table 的 8 个元素来表示这个变量的每一位值(0 或 1)? (像这样:{1, 1, 1, 1, 1, 1, 1, 1})在 c 中有什么简单的方法可以做到这一点吗?

在 C 中提取位的一种常用方法是使用移位操作:

int bits[8];
for (int i = 0 ; i != 8 ; i++) {
    bits[i] = (c & (1 << i)) != 0;
}

1 << i 生成在第 i 位置设置 1 的二进制数,即 12、10 2、1002、10002等。

运算符&使用1 << i作为"mask",在掩码值中选择由1标记的c的单个位。比较 != 0 完成作业,根据位的值生成零或一。

另一种方法是将 c 向右移动,然后用 1 遮盖,如下所示:

int bits[8];
for (int i = 0 ; i != 8 ; i++) {
    bits[i] = (c >> i) & 1;
}

这与第一种方法类似,但屏蔽是在最低有效位位置完成的。

注意:CHAR_BIT 设置为 8 以外的数字的计算机上,这将仅提取低 8 位。

除了按位运算(更好,我会说标准方法),您可以使用联合来访问单个位:

typedef union {
    unsigned char c;
    struct {
        unsigned char b0 :1;
        unsigned char b1 :1;
        unsigned char b2 :1;
        unsigned char b3 :1;
        unsigned char b4 :1;
        unsigned char b5 :1;
        unsigned char b6 :1;
        unsigned char b7 :1;
    };
} byte_struct;

int main(int argc, char** argv) {
    byte_struct c;
    c.c = 0xaa;

    printf("%u\n", c.b7);
    printf("%u\n", c.b6);
    printf("%u\n", c.b5);
    printf("%u\n", c.b4);
    printf("%u\n", c.b3);
    printf("%u\n", c.b2);
    printf("%u\n", c.b1);
    printf("%u\n", c.b0);

    return (EXIT_SUCCESS);
}

注意:单位变量的顺序是实现定义的,所以你应该小心使用它们并使用特定于编译器的标志来强制顺序