在C位运算器中,下列概念是什么?它优化了我的代码,大大缩短了运行时间

在C位运算器中,下列概念是什么?它优化了我的代码,大大缩短了运行时间,c,bit-manipulation,C,Bit Manipulation,它极大地优化了我的代码。之前我有下面给出的代码。有谁能帮我解释一下这种剧烈变化的原因吗 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; }

它极大地优化了我的代码。之前我有下面给出的代码。有谁能帮我解释一下这种剧烈变化的原因吗

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; 

与第一个逻辑相比,需要额外的计算,在第一个逻辑中,如果if语句成功,只返回if。这两个代码段的反汇编都会增加后面代码段中增加的复杂性

有两个主要区别。 首先,在原始代码中,您有一个bug。 基本上,您在这里所做的是查找64位数字中的最高设置位。
当您运行1时,比较生成的两个变体的装配说明,您将看到。您还应该比较编译器优化级别不同的两个变体;num |=1优化代码的神秘实体是什么?您是否在启用优化的情况下编译?您是否验证了旧的实现是正确的?第二个是错误的。在循环之后,我可以是-1,因此num |=1Yes@SunEric我完全理解您在早期实现中产生的额外计算点。我现在明白了。非常感谢你。
num &= 0; 
num |= (1<<i);
return 1ll << (64 - __builtin_clzll(num))