1.用一个表达式,判断一个数X是否是2的N次方(2,4,8,16.....),不可用循环语句。
X:2,4,8,16转化成二进制是10,100,1000,10000。如果减1则变成01,011,0111,01111。两者做按位与运算,结果如果为0,则X是2的N次方。
即:!(X&(X-1))
2.程序输出结果?
#include <iostream>
#include <string>
using namespace std;
int main()
{
int count = 0;
int m = 9999;
while (m)
{
count++;
m = m&(m-1);
}
cout << count << endl;
return 0;
}
此循环为输出m的二进制数中1的个数。举例说明
m: 1010 1010
m-1:1010 1001
m: 1010 1000
m-1:1010 0000
m: 1010 0000
也就是说按位与一次,二进制中最右边的那个1就与掉了,计数器就加1,刚好来计算这个数二进制中1的个数。
写成一函数:
int CountNumberOfOne(int number)
{
int counter = 0;
while (number)
{
counter++;
number &= number - 1 ;
}
return counter;
}