//xk> 例题
【题目】用一个表达式判断一个数X是否是2的N次方。不能用循环语句。
【解答】在面对很多问题的时候,人与人之间的差距不仅仅表现在聪明才智,更表现在专业程度。或言之,绝对智商上差距的影响是微乎其微的,绝大程度上是依赖于:是否更加经验丰富,是否更加训练有素。
就像这个题目,知道的人就知道是一个很小的技巧,第一次见的人就很可能想破脑袋。
2的N次方,其机器表示的特点就是:只有一位1,后面N个0. 这种特点有一个延伸:X & (X - 1)得到全0.
此题的答案很简单:!(X & (X - 1))
此题还可以延伸:一个数X的二进制表示中有多少位1?参见《编程之美》
//xk> 例题
【题目】写一段程序计算一个unsigned int x的二进制表示中有多少位1?
【解答】x的二进制表示中有N位1,做一次x & (x - 1)能够屏蔽掉最低位的一个1.
#include <iostream>
using namespace std;
int
counter(unsigned int x)
{
int count = 0;
while(x) {
count++;
x &= (x - 1);
}
return count;
}