您可以使用标准的按位运算符实现相同的功能。开启一点:
data |= 1 << bitNumber;
右侧( 1 << bitNumber )是用于创建合适的位掩码的位移操作。它采用单个“1”位并向左移动直到达到所需位置。按位或赋值( |= )将新的位掩码与现有的位组合在一起 data 。这会打开所需的位,但其余部分保持不变。
1 << bitNumber
|=
data
关闭一下的代码略有不同:
data &= ~(1 << bitNumber);
您可以在此处看到相同的位移操作。然而,它之前是一元否定运算符( ~ )。这将所有1换成0,将所有0换成1。结果与我们之前使用的位掩码完全相反。这次你不能做按位或操作,否则你将打开所有其他位。按位和赋值( &= 而是用来组合这个面具和 data 变量。这可确保关闭所需的位,其余位置不受影响。
~
&=
在你的代码中, desiredPin 相当于 bitNumber 。
desiredPin
bitNumber
关于按位操作如何工作的完整解释可能非常冗长。如果您需要更多帮助,我建议您在线寻找一个好的教程。
还有 bitSet 和 bitClear Arduino宏使代码比位移和使用更具可读性 AND 和 OR 。格式是 bitSet(what_to_modify,bit_number) 和 bitClear(what_to_modify,bit_number) 。这些转换为非常有效的代码,可用于操作变量和硬件寄存器。例如,如果您想打开Arduino UNO上的引脚13,首先需要查看Arduino引脚13实际上是Atmel atmega328芯片的PORTB上的引脚5。所以命令是:
bitSet
bitClear
AND
OR
bitSet(what_to_modify,bit_number)
bitClear(what_to_modify,bit_number)
bitSet(PORTB,5);