Joh*_*ohn 5 c algorithm performance bits bit-manipulation
这是一个采访问题:
给您一个名为的char变量ch,当您知道它代表一个以二进制形式表示的数字时,它的八位中只有一位等于“ 1”。IE,唯一可能的值为ch:0x1, 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)