解析Arduino的readSwitches函数中三目运算符与位运算逻辑
三目运算符语法说明
你提到的?和:是C/C++(Arduino核心语法是C++子集)中的三目条件运算符,语法规则为:条件判断 ? 条件成立时返回的值 : 条件不成立时返回的值
你看到的:0就是对应条件不成立时直接返回0的写法,是该语法的标准组成部分。
代码整体运行逻辑
这段readSwitches函数的作用是将4个模拟口连接的开关状态,压缩到一个8位无符号整数uint8_t中返回,用不同二进制位标记每个开关是否触发,运行步骤拆解如下:
- 每个分支先通过
analogRead(Ax)读取对应模拟口的电压值,Arduino的模拟读取值范围是0~1023,这里用>500作为阈值判断开关是否处于触发状态(一般是开关按下后给模拟口输入高电平,读值超过阈值) - 开关触发时返回
1<<n,这是位左移操作,作用是给对应开关分配独有的二进制位标记:- A1口开关触发返回
1<<1= 二进制10= 十进制2 - A2口开关触发返回
1<<2= 二进制100= 十进制4 - A3口开关触发返回
1<<3= 二进制1000= 十进制8 - A4口开关触发返回
1<<4= 二进制10000= 十进制16
- A1口开关触发返回
- 所有分支的结果通过
|按位或运算合并,按位或的特性是只要对应二进制位有一个为1,最终结果的该位就为1,最终返回的整数每一位的1/0状态就对应了对应开关的触发/未触发状态。
举个实际运行例子:如果A3和A1的开关按下,A2、A4开关未按,计算过程为:(2) | (0) | (8) | (0) = 10,对应二进制1010,其中第1位和第3位为1,就代表A1、A3开关处于触发状态。
适配你的顺序触发需求的用法
你需要按4、3、1、2的顺序检测触发,对应判断返回值的位即可:
- 开关4对应A4的第4位(值16),触发时该位变为1
- 开关3对应A3的第3位(值8)
- 开关1对应A1的第1位(值2)
- 开关2对应A2的第2位(值4)
你可以依次检测这四个位按顺序变为1,即可判断触发顺序是否符合要求。
内容的提问来源于stack exchange,提问作者Riamd
相关产品推荐
相关产品推荐

