我需要在C语言中计算一个数字的以2为底的对数,但我不能使用math库。答案不需要精确到小数,只需最接近整数即可。我已经思考过了,我知道可以使用while循环,反复除以2直到数值小于2,并记录迭代次数,但是是否可能使用位运算符?
我需要在C语言中计算一个数字的以2为底的对数,但我不能使用math库。答案不需要精确到小数,只需最接近整数即可。我已经思考过了,我知道可以使用while循环,反复除以2直到数值小于2,并记录迭代次数,但是是否可能使用位运算符?
虽然已经有abamert回答了,但为了更加明确,下面是如何编写代码:
Log2(x) = result
while (x >>= 1) result++;
x >> 1
对于C语言中的任何无符号整数而言,等同于x / 2
。/2
和>>1
代码,并查看它们之间的区别。如果其中一个明显比另一个快,你可能会得到两者完全相同的代码。 - abarnert__builtin_clz(x):此函数用于计算整数的前导零。注意:clz = count leading zero’s(在 C/C++ 中)。 考虑32位整数,
log_2_x = 32 - __builtin_clz(x) - 1;
__builtin_clz()
是一个编译器特定的函数,只能在GCC上使用。 - HufF867__builtin_clz()
是一个特定于编译器的函数,只在GCC上可用。 - undefined #include <bit>
int log2(auto i) { return 8*sizeof(i) - std::countl_zero(i) - 1; }
可移植性。
使用g++或clang,可以使用“-std=c++20”或更高版本。这将在x86上使用“bsr”指令,比循环要快得多。
log2()
将会给出错误的答案。 - Dietrich Epp