单片机各种位运算总结

单片机各种位运算总结

当在单片机中需要进行寄存器操作或者读取/发送数据时,可能用到位操作,因此在此做一个总结,将可能用到的位操作进行一个总结并解析。

位运算具体的计算方式:【STM32】位操作、按位与、按位或、按位异或、取反、左移、右移等基础 C 语言知识补充_按位与操作是什么意思-CSDN博客

  • 对某位清零(按位与 &)
 //定义一个变量 a = 1001 1111 b (二进制数)
 unsigned char a = 0x9f;

 //对 bit2 清零
 a &= ~(1<<2);

 //上面一行代码右边括号中的1左移两位,(1<<2)得二进制数:0000 0100 b(这个便是位2的掩码)
 //然后按位取反,~(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 = 1001 1111 b (二进制数)
 unsigned char a = 0x9f;

  //若把a中的二进制位分成2个一组
 //即 bit0、bit1为第0组,bit2、bit3为第1组,
 //   bit4、bit5为第2组,bit6、bit7为第3组
 //现在,我们要对第1组的bit2、bit3清零

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

 //括号中的3左移两位,(3<<2*1)得二进制数:0000 1100 b(这个是位3、位2的掩码)
 //然后按位取反,~(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就被清零了,而其它位不变。

 //上述 (~(3<<2*1)) 中的 1 即为组编号; 如清零第3组bit6、bit7此处应为3,即要左移6位
 //括号中的 2 为每组的位数,每组有2个二进制位; 若分成4个一组,此处即为 4
 //括号中的 3 是组内所有位都为1时的值; 若分成4个一组,此处即为二进制数“1111 b”

 //例如对第2组bit4、bit5清零,3就要左移4位
 a &= ~(3<<2*2);
  • 对某位赋值(按位或 |)
/* 对某位赋值 */

//假设 a = 1000 0011 b
a |= (1<<4);
//此时对变量 a 的 bit4 置1
//置1后,即 a = 1001 0011 b
  • 对某几位赋值(按位或 |)
 //假设 a = 1000 0011 b
 a |= (1<<2*2);
 //此时对清零后的第2组bit4、bit5设置成二进制数“01 b ”(也就是“01 b”左移4位)
 //即 a = 1001 0011 b,成功设置了第2组的值,其它组不变
  • 对某位取反(按位异或 ^)
 //a = 1001 0011 b
 //把bit6取反,其它位不变

 a ^=(1<<6);
 //a = 1101 0011 b
posted @ 2024-03-19 13:49  ihuahua1415  阅读(292)  评论(0)    收藏  举报
*/