我的问题类似于这里的问题
这个问题的最佳答案是:
int isNotZero(unsigned int n){
n |= n >> 16;
n |= n >> 8;
n |= n >> 4;
n |= n >> 2;
n |= n >> 1;
return n & 1;
};
Run Code Online (Sandbox Code Playgroud)
有谁能解释一下上面的算法是如何工作的?
n是一个32位整数.n |= n >> 16获取16个最高位并确保较低16中的等效位为较高16中的每个设置位设置; 同时保持已经设置在较低16位的任何位.
通过这种方式,您现在有一个16位整数,当原始的32位整数是精确的时,它是非零的.然后,以下步骤同样将数字折叠为8位,然后是4,然后是2,然后是1.
最后,最后一行检查是否设置了最低位,通过上面的方法告诉您原始数字是否为非零.