C/C++按位读取
RinpoStk
按位读取
在C中无法直接按位读取,常见的方法是通过位运算获取每一位的数据。
//获取B5第4位
//(B5 & (1 << 5)) >> 5
10110101
& 00010000;
= 00010000
//得到1
采取共用体(联合)可以得到一个既可以按位读取,也可以按字节读取的数据类型
union {
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;
} bits;
unsigned char byte;
}ch;
在这里,定义了一个字节类型 byte
同时共用一个按位分配空间的结构体,这个结构体使用了「位域」。结构体中,可以使用位域来指定分配空间,上述的用法就是分配一个位的空间,达成了按位读取的目的。
示例:
ch.byte = 0xE4; //11100100
printf("%d", ch.bits.b0);
printf("%d", ch.bits.b1);
printf("%d", ch.bits.b2);
printf("%d", ch.bits.b3);
printf("%d", ch.bits.b4);
printf("%d", ch.bits.b5);
printf("%d", ch.bits.b6);
printf("%d", ch.bits.b7);
//输出
//00100111
这里我们可以发现,获取的结果恰好相反,这是为什么?
字节序与比特序
在计算机内部,一般采用小端序对数据存储与处理,而在诸如网络传输和文件存储等场景则使用大端序。上述的情况正是因为 ch
采用小端序存储。但是,小端序是字节序,影响的是字节之间的存储顺序,为什么字节内也会相反?这是因为采用小端序一般也会采取同样的比特序,使低位数据同样储存在低地址。
图示:
这就解释了上述读取相反的原因