需要逻辑解释

时间:2012-02-20 10:59:48

标签: c

我的问题类似于here

问题的最佳答案是:

int isNotZero(unsigned int n){
  n |= n >> 16;
  n |= n >> 8;
  n |= n >> 4;
  n |= n >> 2;
  n |= n >> 1;
  return n & 1;
};

有人可以解释一下上述算法的工作原理吗?

1 个答案:

答案 0 :(得分:6)

n是一个32位整数。 n |= n >> 16取16个最高位,并确保较低16中的等效位为较高16中的每个设置位设置;同时保持已经设置在16下方的任何位。

这样,你现在有一个16位整数,当原始的32位整数是精确的时,它是非零的。然后,以下步骤同样将数字折叠为8位,然后是4,然后是2,然后是1。

最后,最后一行检查是否设置了最低位,通过上面的方法告诉您原始数字是否为非零。