【发布时间】:2012-02-20 19:05:59
【问题描述】:
我的问题和here类似
这个问题的最佳答案是:
int isNotZero(unsigned int n){
n |= n >> 16;
n |= n >> 8;
n |= n >> 4;
n |= n >> 2;
n |= n >> 1;
return n & 1;
};
谁能解释一下上述算法是如何工作的?
【问题讨论】:
标签: 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;
};
谁能解释一下上述算法是如何工作的?
【问题讨论】:
标签: c
n 是一个 32 位整数。 n |= n >> 16 取最高 16 位,并确保为高 16 中的每个设置位设置低 16 中的等效位;同时保持已经在低 16 位中设置的所有位。
通过这种方式,您现在有一个 16 位整数,与原始 32 位整数一样,它是非零的。然后以下步骤类似地将数字折叠为 8 位,然后是 4,然后是 2,然后是 1。
最后,最后一行检查是否设置了最低位,通过上面的方法告诉你原始数字是否非零。
【讨论】: