单片机判断语句与位运算的坑

一.问题描述

在我判断Oled的某点的值是否为1时,用到了如下判断语句

if(oled[x][y/8] &=1<<(y%8)

但是,当我将其改为如下的判断语句,代码却跑出BUG了

if((oled[x][y/8]&=1<<(y%8))==1)

二.原因分析

1.if语句理解错误

首选让我们看看下面的代码运行结果

#include <stdio.h>

int main(){
	int a=-1;
	if(a) printf("此判断为真");
	else
	printf("此判断为假");
}

运行结果如下,实际上只要if判断语句中的值不为,判断即为
在这里插入图片描述

2.位运算不了解

首先我们回到开头,为什么将if判断语句改为是否与1相等就错了呢?在&运算中,是将值的目标位进行判断是否为1,如果该位为1则取1,否则取0.因为我知道目标位不相等直接取,所以我自然而然的认为相等则取1,则是错误的,即使相等也不为1.

三.体会总结

首先,开头的代码完整写法应为:

if((oled[x][y/8] &=1<<(y%8)!=0)

在使用if判断语句时,看括号内是否省略了!=0后缀,如果少了则要提醒自己一下有这个后缀.因为它并不是代表值为1时为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kk_阿白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值