我在AVR微控制器上将引脚定义为8位掩码(因此只设置了一位)。有时我需要引脚的编号。获得它的最有效方法是什么?
为了确保,很明显,我想要一个函数/宏来提供以下输出:
0000 0001 ----> 0
...
0001 0000 ----> 4
...
1000 0000 ----> 7
当然我可以使用像:
这样的功能uint8_t bm_to_index(uint8_t bm)
{
int i;
for (i = 0; i < 8; i++)
{
if ((bm >> i) == 1)
return i;
}
return 8;
}
但我正在寻找比循环更有效的东西。
切换方法肯定会更快:
uint8_t bm_to_index(uint8_t bm)
{
switch (bm)
{
case 0x01: return 0;
case 0x02: return 1;
case 0x04: return 2;
case 0x08: return 3;
case 0x10: return 4;
case 0x20: return 5;
case 0x40: return 6;
case 0x80: return 7;
default: return 8;
}
}
但如果这些方法对于微控制器来说是最干净/最有效的,那么我会感到很惊讶。是不是有一个班轮可以做到这一点?