例1:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数 例如把9表示成二进制是1001,有2为是1 因此输入9则该函数输出2
#include <stdio.h>
#include <iostream>
using namespace std;
#if 0
为了避免死循环 我们左移1也就是二进制的0001 先和n进行&运算
就能判断n的从右数第一位是不是1 依次判断所有 循环次数为整数
二进制的位数 32位整数需要循环32次
#endif
int func(int n)
{
int count = 0;
unsigned int flag = 1;
while (flag)
{
if (flag&n)
++count;
flag = flag << 1;
}
return count;
}
#if 0
改进方法:有几个1就循环几次
把一个整数减去1 再和原整数做&运算 会把该整数最右边一个1变成0
那么一个整数的二进制表示中有多少个1就可以进行多少次这样的操作
#endif
int func1(int n)
{
int count = 0;
while (n)
{
n = (n - 1)&n;
++count;
}
return count;
}
int main(int argc,char *argv[])
{
cout << func(1) << endl;
cout << func(15) << endl;
cout << func(3) << endl;
cout << func(9) << endl;
cout << "------------" << endl;
cout << func1(1) << endl;
cout << func1(15) << endl;
cout << func1(3) << endl;
cout << func1(9) << endl;
return 0;
}
例2:用一条语句判断一个整数是不是2的整数次方,一个整数如果是二的整数次方,那么它的二进制表示中有且只有一位是1,而其他所有位都是0
思路:把这个整数减去1之后再和它自己做&运算,这个整数中唯一的1就会变成0
#include <stdio.h>
#include <iostream>
using namespace std;
bool func(int i)
{
if (i <= 0) //2的整数次方不能为<=0的数
return false;
if (((i - 1)&i) == 0)
return true;
return false;
}
int main(int argc,char *argv[])
{
for (int i = -10; i < 20; i++)
{
if (func(i))
cout << i << "是2的整数次方" << endl;
}
return 0;
}
例3:输入俩个整数m和n,计算要改变m的二进制表示中的多少位才能得到n 比如10的二进制表示为1010,13的二进制表示为1101,需要改变1010中的3位才能得到1101。
思路: 1.求这俩个数的异或^ 2.统计异或结果中1的位数
#include <stdio.h>
#include <iostream>
using namespace std;
int func(int a, int b)
{
int i = a^b; //相同为0 不同为1
int p = 1;
int count = 0;
while (i)
{
i = (i - 1)&i;
++count;
}
return count;
}
int main(int argc,char *argv[])
{
cout << func(10, 13) << endl;
cout << func(1, 15) << endl;
return 0;
}