单片机各种位运算总结
当在单片机中需要进行寄存器操作或者读取/发送数据时,可能用到位操作,因此在此做一个总结,将可能用到的位操作进行一个总结并解析。
位运算具体的计算方式:【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
标签:总结,运算,0011,取反,单片机,按位,清零,某位
From: https://www.cnblogs.com/hnu-hua/p/18082600