You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解析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
  • 所有分支的结果通过|按位或运算合并,按位或的特性是只要对应二进制位有一个为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:36:03