请教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
相关产品推荐
相关产品推荐

