查找char变量中唯一的“ 1”位的索引的最有效方法(在C中)

Joh*_*ohn 5 c algorithm performance bits bit-manipulation

这是一个采访问题:
给您一个名为的char变量ch,当您知道它代表一个以二进制形式表示的数字时,它的八位中只有一位等于“ 1”。IE,唯一可能的值为ch0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80
给定变量ch,我需要编写最有效的代码来获取该“ 1”位的索引。例如:如果ch == 0x1->结果为0。-- ch == 0x4结果为2。

显而易见的方法是使用开关盒,但我需要更高效的东西。
您可以在此处进行一些有效的操作吗?

小智 0

有效的代码行数可以是通过位进行线性搜索。

short bit=0;
const char one=1;
while(!((ch >> bit) & one)) ++bit;
Run Code Online (Sandbox Code Playgroud)

当然,错误检查可能是一个好主意,因此您还可以添加检查以确保您仍然处于有效位。

short bit=0;
const char one=1;
while(++bit < 8 && !((ch >> bit) & one)) {}
Run Code Online (Sandbox Code Playgroud)

它的计算效率肯定不高,并且无法检测何时设置了多个位,因此 switch case 仍然可能是确保正确性的方法。

这个家伙在装配中的跳转次数比 switch case 少,所以也许它在计算位时更有效。

short bit=
    ch&0x2?1:
    (ch&0x4?2:
    (ch&0x8?3:
    (ch&0x10?4:
    (ch&0x20?5:
    (ch&0x40?6:
    (ch&0x80?7:8))))));
Run Code Online (Sandbox Code Playgroud)

您也可以跳过检查最后一位,并假设如果没有其他匹配,则设置第 7 位,这可以节省一次比较。

short bit=
    ch&0x2?1:
    (ch&0x4?2:
    (ch&0x8?3:
    (ch&0x10?4:
    (ch&0x20?5:
    (ch&0x40?6:7)))));
Run Code Online (Sandbox Code Playgroud)