热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C编程中位操作的常见技巧(含个人项目经验)

最近思来想去,觉得需要技术沉淀,于是我注册了个微信公众号(airX嵌入式),这也是为我后续创业公司做准备&#x

最近思来想去,觉得需要技术沉淀,于是我注册了个微信公众号(airX嵌入式),这也是为我后续创业公司做准备,一来能分享记录我的开发项目,以及开源一切设计;二来能结识更多的同道中人!有机会可以合作创业!

微信扫码关注我!(airX嵌入式)

 

在C项目中,我们常常会遇到设置某个参数中的n位数值或者读取某个参数的n位数值,如果每次都口算出整个参数的值再使用与或算法那真的费时间,弄不好算错了那就更麻烦了!

举个例子:假设寄存器A为32Bit长度寄存器,请将27位的值置位0?

如果你傻傻的有下面这个做法,那建议你把这篇文章看完,对你肯定有帮助。

做法:根据与或运算法则,算出当27位为0,其他位为1的32bit的值为

0xF7FFFFFF;

然后A &=0xF7FFFFFF;

 

为了杜绝上面的麻烦和错误的风险!

下面我列举几个常见的操作,也是本人写代码的操作:

声明:以下说到的寄存器当然是可以读取写入的寄存器

 

写操作:

1、把寄存器/变量的第n位清零,不改变其他位的数值

  void a;

  a= 0x12345678;

 a &&#61;~(1<<12);  //第12bit置0&#xff0c;其他不变&#xff1b;

同理&#xff1a;a &&#61; ~(1<<27); //第27bit置0&#xff0c;其他不变&#xff1b;

公式&#xff1a;a &&#61;~(1<

 

2、把寄存器/变量的第n位起的连续m位清零&#xff0c;不改变其他位的数值

 void a&#xff1b;

a &#61; 0x12345678&#xff1b;

a &&#61; ~(3<<1); //第1位起的连续2位清零

a &&#61; ~(7<<2); //第2位起的连续3位清零

公式 a &&#61; ~((2^m-1)<

2^m-1表示的是m位都为1的二进制的十进制数值&#xff0c;比如3表示二进制0b00000011&#xff0c;表示连续2位&#xff1b;7表示二级制0b00000111&#xff0c;表示连续3位&#xff1b;

 

3、把寄存器/变量的第n位置1&#xff0c;不改变其他位的数值

 void a&#xff1b;

a &#61; 0x12345678&#xff1b;

a |&#61; (3<<1); //第1位起的连续2位置1

a |&#61; (7<<2); //第2位起的连续3位置1

公式&#xff1a;a |&#61;(1<

 

4、把寄存器/变量的第n位起的连续m位置1&#xff0c;不改变其他位的数值

 void a&#xff1b;

a &#61; 0x12345678&#xff1b;

a |&#61; (3<<1); //第1位起的连续2位置1

a |&#61; (7<<2); //第2位起的连续3位置1

公式 a |&#61; ((2^m-1)<

2^m-1表示的是m位都为1的二进制的十进制数值&#xff0c;比如3表示二进制0b00000011&#xff0c;表示连续2位&#xff1b;7表示二级制0b00000111&#xff0c;表示连续3位&#xff1b;

 

5、对寄存器/变量的第n位取反

 void a&#xff1b;

a &#61; 0x12345678&#xff1b;

a ^&#61; (1<<1); //第1位取反

a ^&#61; (1<<2); //第2位取反

公式&#xff1a;a ^&#61; (1<

 

读操作&#xff1a;

1、读寄存器/变量的第n位

 void a&#xff0c;result&#xff1b;

a &#61; 0x12345678&#xff1b;

result&#61;a& (1<<2); //读第2位

result&#61;a& (1<<3); //读低3位

公式&#xff1a;result&#61;a& (1<

 

2、读寄存器/变量的第n位起的连续m位

 void a&#xff0c;result&#xff1b;

a &#61; 0x12345678&#xff1b;

result&#61;a& (3<<2); //读第2位开始的连续2位数据

result&#61;a& (3<<27); //读第27位开始的连续2位数据

公式result&#61;a& ((2^m-1)<

2^m-1表示的是m位都为1的二进制的十进制数值&#xff0c;比如3表示二进制0b00000011&#xff0c;表示连续2位&#xff1b;7表示二级制0b00000111&#xff0c;表示连续3位&#xff1b;

 

 

像这种操作&#xff0c;判断时可以完全脱离位置的计算&#xff0c;只需看变量名称就可操作&#xff01;

下面这些是别人厂家的库函数&#xff1a;也是如此定义

图片

 

图片

清除的操作&#xff1a;

图片

清除置位都有的函数&#xff0c;只需传入上面宏定义的参数即可操作&#xff1b;

图片

 


下面是我的一个断路器项目&#xff0c;其中因为要记录各种故障原因&#xff0c;因此需要很多的标志位&#xff01;

1、我的第一步操作就是使用位移操作宏定义故障原因&#xff0c;如下1&#xff0c;以及一个缓存故障原因的缓存变量&#xff0c;如图2&#xff1b;

图片

图1

图片 

图2

 

 

2、构建获取相应故障状态的函数&#xff0c;如下操作&#xff1a;

 

3、构建清除相应故障状态的函数&#xff0c;如下操作&#xff1a;

图片

 

 

4、构建设置相应故障状态的函数&#xff0c;如下操作&#xff1a;

图片

 

最后只需调用&#xff0c;传入相应的故障宏定义即可&#xff01;这样做的话&#xff0c;直接读函数名就可以知道该函数的作用&#xff01;避免当枚举太多&#xff0c;导致混乱&#xff01;

 

 

微信扫码关注我&#xff01;&#xff08;airX嵌入式&#xff09;

 


推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 近年来,大数据成为互联网世界的新宠儿,被列入阿里巴巴、谷歌等公司的战略规划中,也在政府报告中频繁提及。据《大数据人才报告》显示,目前全国大数据人才仅46万,未来3-5年将出现高达150万的人才缺口。根据领英报告,数据剖析人才供应指数最低,且跳槽速度最快。中国商业结合会数据剖析专业委员会统计显示,未来中国基础性数据剖析人才缺口将高达1400万。目前BAT企业中,60%以上的招聘职位都是针对大数据人才的。 ... [详细]
  • 企业数据应用挑战及元数据管理的重要性
    本文主要介绍了企业在日常经营管理过程中面临的数据应用挑战,包括数据找不到、数据读不懂、数据不可信等问题。针对这些挑战,通过元数据管理可以实现数据的可见、可懂、可用,帮助业务快速获取所需数据。文章提出了“灵魂”三问——元数据是什么、有什么用、又该怎么管,强调了元数据管理在企业数据治理中的基础和前提作用。 ... [详细]
  • 小程序获取用户信息按钮返回中文地址
    1.我是根据官方文档中描述去写的按钮 可以看到button中加了zh_CNopen-typegetUserInfobindgetuserinfogetU ... [详细]
  • 2022年的风口:你看不起的行业,真的很挣钱!
    本文介绍了2022年的风口,探讨了一份稳定的副业收入对于普通人增加收入的重要性,以及如何抓住风口来实现赚钱的目标。文章指出,拼命工作并不一定能让人有钱,而是需要顺应时代的方向。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
author-avatar
嘉兴布奇乐乐园
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有