C/C++按位读取

打印 上一主题 下一主题

主题 924|帖子 924|积分 2772

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

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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大号在练葵花宝典

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表