Notes02:常用位操作方法

野火霸道开发板学习笔记

信息说明

  • 开发板: 野火霸道V2
  • 芯片型号: STM32F103ZET6
  • 下载器型号: 野火fireDAP下载器(高速版)
  • 软件环境: Keil5(MDK-ARM V5.15)
  • 芯片包型号: Keil.STM32F1xx_DFP.1.1.0 注: 亲测版本2.4.0不可用
  • 操作系统 : Win11

位操作方法

把某位清零

此处我们以变量 a 代表寄存器,并假设寄存器中本来已有数值,此时我们需要把变量 a 的某一位清零,且其它位不变

unsigned char a = 0x9f; // 1001 1111

// 把Bit2清零
a &= ~(1 << 2);

/*
 * 括号中的 1 左移两位,(1<<2) 得二进制数:0000 0100 b
 * 按位取反,~(1<<2) 得 1111 1011 b
 * 假如 a 中原来的值为二进制数: a = 1001 1111 b
 * 所得的数与 a 作”位与&”运算,a = (1001 1111 b)&(1111 1011 b)
 * 经过运算后,a 的值 a=1001 1011 b
 * a 的 bit2 位被被零,而其它位不变
 */

将变量a的bit n位清零, a &= ~(1 << n)

把某连续几位清零

/*
 * 把a中的二进制分成2个一组
 * 即bit0, bit1 为第0组, bit2, bit3 为第1组, bit4, bit5 为第2组, bit6, bit7 为第3组
 * 若要将bit2, bit3清零
 */

unsigened cha a = 0x9f; // 1001 1111
a &= ~(3 << 2 * 1);

/*
 * 括号中的 3 左移两位,(3<<2*1) 得二进制数:0000 1100 b
 * 按位取反,~(3<<2*1) 得 1111 0011 b
 * 假如 a 中原来的值为二进制数: a = 1001 1111 b
 * 所得的数与 a 作”位与&”运算,a = (1001 1111 b)&(1111 0011 b)
 * 经过运算后,a 的值 a=1001 0011 b
 * a 的第 1 组的 bit2、bit3 被清零,而其它位不变
 */

将变量的二进制先分成n个一组 ,若该组的所有位都为1的值等于m, 对第i组清零, 则a &= ~(m << n * i);

// 例如对第 *2* 组 bit4、bit5 清零

a &= ~(3 << 2 * 2);

对变量的连续几位赋值

先将变量经过上述方法清零

//a = 1000 0011 b
//此时对清零后的第 2 组 bit4、bit5 设置成二进制数“01 b ”

a |= (1<<2*2);

对清零后的第i组设置成某二进制数, 该数对应的十进制为b

a |= (b << n * i); // 分成n个一组

对变量的某位取反

把bit6取反, a ^= (1 << 6);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值