#include <stdio.h>
unsigned int reverseBits(unsigned int num)
{
unsigned int reverse_num = 0;
for(int i = 0; i < sizeof(unsigned int) * 8; ++i)
{
reverse_num = (reverse_num | (num & 1));
num = num >> 1;
if(i != (sizeof(unsigned int) * 8) - 1)
reverse_num = reverse_num << 1;
}
return reverse_num;
}
int main()
{
unsigned int num = 0;
scanf("%u", &num);
printf("bit reverse of %u is %u\n", num, reverseBits(num));
return 0;
}
此位反转功能的时间复杂度是多少,如果我们将输入大小更改为uint_8 / uint_16 / uint64_t,则for循环将运行输入大小* 8倍。对于n个输入,此功能以恒定的时间运行。那么,以大“ O”符号表示此函数的时间复杂度是多少?
答案 0 :(得分:0)
O(n),用于 n 位。
对于uint_8
,该算法以8个步骤运行。
对于uint_16
,算法运行16个步骤。
等
我不是专家,但是某些指令集可能会有一个单周期位反转(使用__asm__
),因此您可以在O(n)中运行n个 bytes ;快八倍。如果您使用-O3
,某些编译器可能会自动执行此操作。