#include <stdio.h>
unsigned long long high = 0xffffffff00000000, low = 0xffffffff;
int ans = 64, cnt = 16;
int main() {
unsigned long long num;
scanf("%llu",&num);
if(num == 0) {
printf("0");
return 0;
}
while(cnt > 0) {
if((num & low) > 0) {
high = low;
low >>= cnt;
high -= low;
ans -= cnt << 1;
}
else {
low = high;
high <<= cnt;
low -= high;
}
cnt >>= 1;
}
printf("%d",ans -= ((low & num) > 0 ? 1 : 0));
return 0;
}
算法作用:查找64位无符号整数在二进制下的第一个1的位置(例如12(10)=1100(2),代码将输出3)
实现方法:二分(不太好描述)
时间复杂度:O(log2(k)),k为输入数字在二进制下的位数(代码输入的是64位无符号整数所以时间复杂度应为O(6))