朱有鹏:寄存器修改指定位或多个不连续位,左移<< 设置特定二进制数

发布时间 2023-03-23 23:42:00作者: 悟透

一:设置连续,特定位为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