一:设置连续,特定位为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
标签:朱有鹏,23,二进制,左移,修改,寄存器,0x1F,位为 From: https://www.cnblogs.com/wutou/p/17249738.html