在微控制器上有效地找到位位置

时间:2016-02-23 10:29:08

标签: c bit-manipulation avr

我在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;
    }
}

但如果这些方法对于微控制器来说是最干净/最有效的,那么我会感到很惊讶。是不是有一个班轮可以做到这一点?

0 个答案:

没有答案