【发布时间】:2020-10-20 16:06:38
【问题描述】:
我正在用 C 编写代码,并希望找出最有效的方法来确定 2 除以多少次;即 5 = 0, 8 = 3。我的问题是,使用此代码,我利用按位运算来加快运行时间,总体代码为 O(log N),我可以做些什么计算或分析来优化此代码?
int Prime_Factor_Two(int n) {
int k = 0;
while(~(n&1) + 2){
n = n >> 1;
k +=1;
}
return k;
}
【问题讨论】:
-
仅对正数?
-
n进入一个数的次数是log₂(n),也就是O(1)。
-
对于
int,只有 30 个数字是 2 的正幂,其他 42 亿个数字不会匹配。您可以在 O(1) 时间内使用switch轻松完成此操作。 -
while(~(n&1) + 2)(三算一测)可以简化为while((n&1) == 0)(一算一测)。 -
如果你可以使用内联汇编,一些 CPU 有内置指令,例如BSF。并且您的编译器可能有内在函数也可以在没有汇编的情况下调用它们,例如__builtin_ffs 用于 GCC 或 _BitScanForward 在 MSVC 中
标签: c optimization