查看: 2212  |  回复: 1
单片机C语言零基础入门05 - 逻辑运算
JackMCU
32
主题
47
回复
发表于2020-12-09 18:01:23 | 只看该作者
1# 电梯直达

硬件家园单片机C语言零基础入门资料汇总链接:  

https://mp.weixin.qq.com/s/hMTreNUX_V90461tvALjJA


一、逻辑与或非

基础理论:

逻辑与或非,运算对象是布尔值(1或0,真或假),类似于数字电路的与门,或门,非门。与关系运算符配合,一般用于选择语句与循环语句中

1、逻辑与


符号为&&。 参与运算的两个表达式都为真时,结果才为真,否则为假。


例如:

uint8_t  a = 3,b=5;


if((a==3) && (b==5))


{执行};

2、逻辑或


符号为||。 参与运算的两个表达式只要有一个为真,结果就为真;两个表达式都为假时结果才为假。

例如:

uint8_t  a = 4,b=5;


if((a==3) || (b==5))


{执行};

3、逻辑非


符号为!。 参与运算的表达式为真时,结果为假;参与运算的表达式为假时,结果为真。

例如:

bit Flag = 0;


if(!Flag)


{执行};

应用举例:


直播现场编程。



二、按位与或反

按位与或反,运算对象是8位,16位或32位的整型数据,运算数据的每一比特位按逻辑与或非操作。

1、按位与


符号为&。参与运算的两个数据按二进制位进行逻辑与操作。


例如:

uint8_t  a = 0xAA,b=0x55,c;


c = a & b = 0x00;



特殊应用:

清零指定比特位

清零第0位: 运算数据 & 0xFE    //1111 1110      ~(0x01 << 0)


清零第1位: 运算数据 & 0xFD   //1111 1101      ~(0x01 << 1)

清零第2位: 运算数据 & 0xFB   //1111 1011      ~(0x01 << 2)

清零第3位: 运算数据 & 0xF7   //1111 0111      ~(0x01 << 3)

清零第4位: 运算数据 & 0xEF   //1110 1111      ~(0x01 << 4)

清零第5位: 运算数据 & 0xDB  //1101 1111      ~(0x01 << 5)

清零第6位: 运算数据 & 0xB7   //1011 1111      ~(0x01 << 6)

清零第7位: 运算数据 & 0x7F   //0111 1111      ~(0x01 << 7)

2、按位或


符号为|。 参与运算的两个数据按二进制位进行逻辑或操作。


例如:

uint8_t  a = 0xAA,b=0x55,c;


c = a | b = 0xFF;



特殊应用:

置位指定比特位

置位第0位: 运算数据 | 0x01    //0000 0001      (0x01 << 0)


置位第1位: 运算数据 | 0x02   //0000 0010       (0x01 << 1)

置位第2位: 运算数据 | 0x04   //0000 0100       (0x01 << 2)

置位第3位: 运算数据 | 0x08   //0000 1000       (0x01 << 3)

置位第4位: 运算数据 | 0x10   //0001 0000       (0x01 << 4)

置位第5位: 运算数据 | 0x20   //0010 0000       (0x01 << 5)

置位第6位: 运算数据 | 0x40   //0100 0000      (0x01 << 6)

置位第7位: 运算数据 | 0x80   //1000 0000       (0x01 << 7)

3、按位取反


符号为~。 参与运算的数据按二进制位进行逻辑非操作。


例如:

uint8_t  a = 0xAA,b=0x55,c;


c = ~a  = 0x55;

c = ~b  = 0xAA;

应用举例:


直播现场编程。



三、按位异或

基础理论:

符号为^,参与运算的两个数据按二进制位进行“异或”运算。

运算规则:0^0=0;0^1=1;1^0=1;1^1=0;


例如:

uint8_t  a = 0xAA,b=0x55,c;


c = a^b = 0xFF;

uint8_t  a = 0xFF,b=0xFF,c;


c = a^b = 0x00;



特殊应用:

取反指定比特位

取反第0位: 运算数据 ^ 0x01    //0000 0001     (0x01 << 0)


取反第1位: 运算数据 ^ 0x02    //0000 0010     (0x01 << 1)

取反第2位: 运算数据 ^ 0x04    //0000 0100     (0x01 << 2)

取反第3位: 运算数据 ^ 0x08    //0000 1000     (0x01 << 3)

取反第4位: 运算数据 ^ 0x10   //0001 0000      (0x01 << 4)

取反第5位: 运算数据 ^ 0x20   //0010 0000      (0x01 << 5)

取反第6位: 运算数据 ^ 0x40   //0100 0000      (0x01 << 6)

取反第7位: 运算数据 ^ 0x80   //1000 0000      (0x01 << 7)



应用举例:


直播现场编程。



四、左移与右移

基础理论:

符号为<<与>>,运算对象是8位,16位或32位的整型数据, 把数据向左或向右移动若干位。向左移动时,高位溢出,低位补0;向右移动时,低位溢出,高位补0,。

例如:

uint8_t  a = 0xCB,c;


c = a << 5 = 0x40;

c = a >> 3 = 0x19;

应用举例:

直播现场编程。



如果你只做能力范围之内的事情,就永远没法进步。
蜗牛不吃路边草
0
主题
13
回复
发表于2022-01-18 14:00:18   |  只看该作者
2#
c = a << 5 = 0x40;   应该是60哦

主题

回复
  • 温馨提示: 标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考: 社区发帖规则
  • 您当前输入了 0 个文字。还可以输入 8000 个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

禁言/删除

X
请选择禁言时长:
是否清除头像:
禁言/删除备注:
昵 称:
 
温馨提示:昵称只能设置一次,设置后无法修改。
只支持中文、英文和数字。

举报

X
请选择举报类型:
请输入详细内容:

顶部