ToB企服应用市场:ToB评测及商务社交产业平台

标题: C/C++按位读取 [打印本页]

作者: 大号在练葵花宝典    时间: 2023-6-26 12:39
标题: C/C++按位读取
RinpoStk
按位读取

在C中无法直接按位读取,常见的方法是通过位运算获取每一位的数据。
  1. //获取B5第4位
  2. //(B5 & (1 << 5)) >> 5
  3.         10110101
  4. &        00010000;
  5. =        00010000
  6. //得到1
复制代码
采取共用体(联合)可以得到一个既可以按位读取,也可以按字节读取的数据类型
  1. union {
  2.     struct {
  3.         unsigned char b0 : 1;
  4.         unsigned char b1 : 1;
  5.         unsigned char b2 : 1;
  6.         unsigned char b3 : 1;
  7.         unsigned char b4 : 1;
  8.         unsigned char b5 : 1;
  9.         unsigned char b6 : 1;
  10.         unsigned char b7 : 1;
  11.     } bits;
  12.     unsigned char byte;
  13. }ch;
复制代码
在这里,定义了一个字节类型 byte 同时共用一个按位分配空间的结构体,这个结构体使用了「位域」。结构体中,可以使用位域来指定分配空间,上述的用法就是分配一个位的空间,达成了按位读取的目的。
示例:
  1. ch.byte = 0xE4;                //11100100
  2. printf("%d", ch.bits.b0);
  3. printf("%d", ch.bits.b1);
  4. printf("%d", ch.bits.b2);
  5. printf("%d", ch.bits.b3);
  6. printf("%d", ch.bits.b4);
  7. printf("%d", ch.bits.b5);
  8. printf("%d", ch.bits.b6);
  9. printf("%d", ch.bits.b7);
  10. //输出
  11. //00100111
复制代码
这里我们可以发现,获取的结果恰好相反,这是为什么?
字节序与比特序

在计算机内部,一般采用小端序对数据存储与处理,而在诸如网络传输和文件存储等场景则使用大端序。上述的情况正是因为 ch 采用小端序存储。但是,小端序是字节序,影响的是字节之间的存储顺序,为什么字节内也会相反?这是因为采用小端序一般也会采取同样的比特序,使低位数据同样储存在低地址。
图示:

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4