关于C语言位运算符&=的疑问:state &= 0x07如何实现循环?
解释步进电机代码中的
state &= 0x07;逻辑 这行代码是用按位与运算实现state在0-7之间循环的,核心逻辑拆解如下:
先看
0x07的二进制:对于uint8_t类型的变量,0x07是00000111。按位与(&)的规则是:只有对应二进制位都为1时,结果位才是1,否则为0。所以state &= 0x07;的本质是只保留state的低3位,强制将所有高位清零。结合
state的递增逻辑具体看:- 当
state在0-7之间时,它的二进制低3位就是自身(比如7是00000111),和0x07按位与后结果完全不变,刚好匹配HalfSteps数组的索引范围(数组共8个元素,索引0-7)。 - 当
state递增到8时,二进制是00001000,低3位是000,按位与后结果为0,相当于自动重置到初始状态,实现循环。 - 哪怕
state意外变成更大的数(比如9是00001001),按位与0x07后会得到00000001(也就是1),依然落在0-7的有效区间内。
- 当
为什么用位运算而不是取模?因为对于2的n次方的取模(这里是对8取模,8=2³),
& (2ⁿ -1)的位运算比%取模的执行效率更高,在嵌入式步进电机驱动这种对性能有要求的场景中,这种写法很常见。
你之前误以为是state = state +7,这完全是两种逻辑——加7会让数值持续增大,而这行位运算直接把超出范围的数值“折叠”回0-7区间,既保证了HalfSteps数组索引的合法性,又实现了步进状态的循环切换。
内容的提问来源于stack exchange,提问作者johnnyh20
相关产品推荐
相关产品推荐

