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