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

图示:

这就解释了上述读取相反的原因

热门相关:有个人爱你很久   锦乡里   前任无双   天神诀   半仙