首页 > 编程语言 >C/C++按位读取

C/C++按位读取

时间:2023-06-26 11:26:48浏览次数:54  
标签:ch 读取 unsigned C++ char 按位 printf bits

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

图示:

图示

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

标签:ch,读取,unsigned,C++,char,按位,printf,bits
From: https://www.cnblogs.com/rinpostk/p/17500504.html

相关文章

  • 突击-C++
    C++完全支持面向对象的程序设计,包括面向对象开发的四大特性:封装:是将数据和方法组合在一起,对外部隐藏实现细节,只公开对外提供的接口。这样可以提高安全性、可靠性和灵活性。继承:是从已有类中派生出新类,新类具有已有类的属性和方法,并且可以扩展或修改这些属性和方法。这样可......
  • C++面试八股文:std::array如何实现编译器排序?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第25面:面试官:array熟悉吗?二师兄:你说的是原生数组还是std::array?面试官:你觉得两者有什么区别?二师兄:区别不是很大,原生数组(非动态数组)和std::array都在栈上开辟空间,初始化的时候需要提供数组长度,且长度不可改变。有一点区别的是,st......
  • C++面试八股文:std::array如何实现编译器排序?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第25面:面试官:array熟悉吗?二师兄:你说的是原生数组还是std::array?面试官:你觉得两者有什么区别?二师兄:区别不是很大,原生数组(非动态数组)和std::array都在栈上开辟空间,初始化的时候需要提供数组长度,且长度不可改变。有一点区别的是,std......
  • C++ 核心指南之资源管理(中)
    C++核心指南之资源管理(中)R.alloc:分配和释放R.10:避免使用malloc()/free()R.11:避免显式调用new/deleteR.12:显式资源分配的结果应立即给到资源管理对象R.13:在一条语句中,最多只能有一个显式资源分配R.14:避免使用[]参数,用span替代R.15:分配/释放操作要......
  • C++ 数据抽象
     数据抽象是指,只向外界提供关键信息,并隐藏其后台的实现细节,即只表现必要的信息而不呈现细节。数据抽象是一种依赖于接口和实现分离的编程(设计)技术。让我们举一个现实生活中的真实例子,比如一台电视机,您可以打开和关闭、切换频道、调整音量、添加外部组件(如喇叭、录像机、DVD播......
  • Linux从文件中逐行读取文件名并将匹配的文件复制到指定目录
    问题应该算挺常见的但是一句话还挺难说清楚,所以百度特别难搜。场景就是,有一堆以员工名称命名的文件(名称可能还有字母数字等前后缀),现在给定一个员工清单,需要从这些文件中筛选出员工清单上列出的员工的文件,并复制到另外一个目录中。输入:1.许多文件名包含员工名称的文件2.一个清......
  • C/C++C/C++语言课程设计参考题目[2023-06-25]
    C/C++C/C++语言课程设计参考题目[2023-06-25]《高级程序设计技术综合课程设计》C/C++语言课程设计参考题目目录信息管理类 1工资管理系统 1职工工资信息管理系统 2职工工资管理系统 2院职工工资管理系统 3公司职工工资管理系统 3工资纳税计算系统 3校际运动会管理系统......
  • Python3 configparser读取含有中文配置config.ini(Windows)显示乱码的解决方法
    最近在配置文件config.ini有中文输出时,python3打印出来显示乱码。初步判断是由于编码问题。在Python3中虽有encoding参数,但是对于有BOM(如Windows下用记事本指定为utf-8)的文件,需要使用utf-8-sig,使用utf-8没办法。配置文件config.ini如下:[TABLEDATA]project_name......
  • C++面试八股文:std::string是如何实现的?
    C++面试八股文:std::string是如何实现的?某日二师兄参加XXX科技公司的C++工程师开发岗位第18面:面试官:std::string用过吧?二师兄:当然用过(废话,C++程序员就没有没用过std::string的)。面试官:std::string("hello")+"world"、"hello"+std::string("world")和std::string("hello")......
  • Qt/c++类型转换总结
    1、static_cast、dynamic_cast、强制转换(reinterpret_cast和const_cast)、qobject_cast、qstatic_cast以及qdynamic_cast的区别:static_cast:用于执行静态类型转换,可以进行常见的类型转换,例如基本类型之间的转换、向上转型、向下转型(但没有运行时类型检查)等。在C++中......