c - C中的按位运算符下面的概念是什么?它优化了我的代码并大大减少了运行时间

标签 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; 
   } 
} 
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/

相关文章:

c++ - 按位比较

c - 缓存中的位屏蔽

java - 找出以二进制表示正整数所需的位数?

opengl - 在着色器中,intBitsToFloat和floatBitsToInt

c - fork() pipeline() dup2 无法与外部子进程通信

改变指针指向的字符的值

c - 返回c中的缓冲区

c - 使用 autotools 链接 gstreamer 插件中的外部库

在 C 中创建大型数组

c# - 移位同时保留模式