如何获取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);
}
注意:单位变量的顺序是实现定义的,所以你应该小心使用它们并使用特定于编译器的标志来强制顺序
在 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);
}
注意:单位变量的顺序是实现定义的,所以你应该小心使用它们并使用特定于编译器的标志来强制顺序