朱有鹏:寄存器修改指定位或多个不连续位,左移<< 设置特定二进制数
一:设置连续,特定位为1
问:假设要有一组32位的二进制数,要修改其中 3~7bit 位的位为1 (其他位为0),该如何写?
答:
思路:
7-3+1 (第7位减去第3位,加1是公式必须这样这么写,先获取要修改几位) 结果是 5位。
5位二进制1,转十六进制是0x1F , 将 1F 左移3位(为什么要移3位,因为题目中是修改第3位,如果不左移就是从第0位开始)
代码: 0x1F << 3
下图: 值是 0x1F
下图:值左移3位
二:设置不连续,特定位为1
问:假设要有一组32位的二进制数,要修改其中 3~7bit 位的位为1 ; 23~25bit 位的位也为1(其他位为0),这两组该如何写?
答:
思路:
7-3+1 (第7位减去第3位,加1是公式必须这样这么写,先获取要修改几位) 结果是 5位。
5位二进制1,转十六进制是0x1F , 将 1F 左移3位(为什么要移3位,因为题目中是修改第3位,如果不左移就是从第0位开始)
25-23+1(第25位减去第23位,加1是公式必须这样这么写,先获取要修改几位) 结果是 3位。
3位二进制1,转十六进制是0x7 , 将 7 左移23位(为什么要移23位,因为题目中是修改第23位,如果不左移就是从第0位开始)
代码: ((0x1F << 3) | (0x7<<23))
--------------------------------------------------------------------------------------------------------------------------------------
以上两个方法,在1或者0多的时候,计算繁琐,建议使用下面 ”位取反“ 方式,是比较聪明的方式
--------------------------------------------------------------------------------------------------------------------------------------
三、设置连续,特定位为1(位取反方式)(推荐使用)
问:假设要有一组32位的二进制数,要修改其中 4~10bit 位的位为1 (其他位为0),该如何写?
答:
思路:
10-4+1 (第10位减去第4位,加1是公式必须这样这么写,先获取要修改几位) 结果是 7位。
7位二进制1,转十六进制是0x7F , 将 7F 左移3位(为什么要移4位,因为题目中是修改第4位,如果不左移就是从第0位开始)
代码: ~(0x7f<<4)
来源:
朱有鹏-嵌入式软件工程师完全学习路线图专题\4.C语言高级专题精讲视频课程套餐\4.2.C语言位操作\4.2.3.如何用位运算构建特定二进制数.mp4
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!