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

请教DIP开关状态编码代码中位移运算语句的实现逻辑

Arduino DIP开关状态编码核心代码详解

你提到的这段代码是把4位DIP开关的状态转换成十进制数字,核心逻辑集中在encoded_state |= 1 << (POSITION_NUM - i - 1)这一行,下面拆解每部分的作用:

完整示例代码

/*
 * This example code is in the public domain
 *
 * Tutorial page: https://arduinogetstarted.com/tutorials/arduino-dip-switch
 */

#define POSITION_NUM 4
#define ON LOW
#define OFF HIGH

// define the pins connected to the dip switch
const int SWITCH_PINS[] = { 2, 3, 4, 5 };

void setup() {
  // Initialize serial communication
  Serial.begin(9600);

  // Set the DIP switch pins as inputs with pull-up resistors enabled
  for (int i = 0; i < POSITION_NUM; i++)
    pinMode(SWITCH_PINS[i], INPUT_PULLUP);
}

void loop() {
  int encoded_state = 0;
  for (int i = 0; i < POSITION_NUM; i++) {
    int state = digitalRead(SWITCH_PINS[i]);

    if (state == ON)                                
      encoded_state |= 1 << (POSITION_NUM - i - 1); 
  }
}

核心代码逐段解释

1. 基础运算符含义

  • 1 << n(左移运算符):把二进制的1向左移动n位,结果等价于2^n。比如1 << 3对应二进制1000(十进制8),1 << 0对应二进制0001(十进制1)。
  • |=(按位或赋值):把右边的值和左边变量做按位或运算,再将结果赋值给左边变量。按位或规则是:对应位只要有一个是1,结果位就是1。比如0000 | 1000 = 1000,1000 | 0001 = 1001。

2. 循环索引的计算逻辑

POSITION_NUM - i - 1是为了让第一个读取的开关对应二进制最高位,最后一个对应最低位,符合我们从左到右读DIP开关的习惯:

  • 当i=0(读取第一个开关,引脚2):4-0-1=3 → 1<<3=8(二进制1000),开关ON时,将encoded_state的第3位(从0开始计数)设为1。
  • 当i=1(读取第二个开关,引脚3):4-1-1=2 → 1<<2=4(二进制0100),开关ON时设置第2位。
  • 当i=2(读取第三个开关,引脚4):4-2-1=1 → 1<<1=2(二进制0010),开关ON时设置第1位。
  • 当i=3(读取第四个开关,引脚5):4-3-1=0 → 1<<0=1(二进制0001),开关ON时设置第0位。

3. 实际效果举例

比如:

  • 仅第一个开关ON:encoded_state = 8(二进制1000)
  • 第一个和第四个开关ON:encoded_state = 8+1=9(二进制1001)
  • 所有开关ON:encoded_state = 8+4+2+1=15(二进制1111)

补充:为什么ON定义为LOW

代码中用了INPUT_PULLUP模式,Arduino引脚内部上拉电阻会让默认状态为HIGH;当DIP开关闭合时,引脚被拉到GND,状态变为LOW,因此用ON LOW表示开关处于闭合激活状态。

内容的提问来源于stack exchange,提问作者Luong Anh Minh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:12:09