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 采用小端序存储。但是,小端序是字节序,影响的是字节之间的存储顺序,为什么字节内也会相反?这是因为采用小端序一般也会采取同样的比特序,使低位数据同样储存在低地址。
图示:

这就解释了上述读取相反的原因
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |