for(idx = 63; idx >= 0; idx--){
if((num & (1ll<<idx)) != 0)
return 1ll << idx;
}
它极大地优化了我的代码。早些时候我有下面给出的代码。谁能帮我解释一下这种巨大变化的原因吗?
int i,j;
for(i=63;i>=0;i--){
if(num & (1<<i)){
break;
}
}
num &= 0;
num |= (1<<i);
return num;
最佳答案
有两个主要区别。 首先,在原始代码中存在错误。 基本上,您在这里所做的就是寻找 64 位数字中的最高设置位。 当你运行 1 << i 时,你总是会得到一个零,直到 i 低于 32。当你将其更改为 1ll 时,它会被转换为 long long,因此 1ll << i 会为 i 生成一个非 0 的数字> 32. 第二个区别是返回数字时保存的&和shift。
顺便说一句,你可以在没有 while 循环的情况下完成整个事情(至少使用 GCC)。只要这样做:
return 1ll << (64 - __builtin_clzll(num))
关于c - C中的按位运算符下面的概念是什么?它优化了我的代码并大大减少了运行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25764917/