今天要讲解的是&运算符的一些特殊的用法。
在使用&运算符时,假设有一个整数n,此时进行(n-1)&n的操作,每进行一次,就能消去n的二进制位中从右向左的第一个1,其原理如下:
比如说9,9的二进制位是: 1 0 0 1
此时我们将其-1,得到二进制位为:1 0 0 0
此时将两个二进制进行&的操作,得到的就是1 0 0 0,此时即消去了第一个1
然后将1 0 0 0再进行减去1的操作,可以得到0 1 1 1
将0 1 1 1与1 0 0 0进行&操作,得到的就是0 0 0 0,即此时的值已经变为了0,且这个操作进行了两次,故9的二进制位中一共有两个1.
现在知道了原理,我们可以看看下面的两个例题。
例题1:求一个整型变量中二进制位中1的个数。
#include <iostream>
using namespace std;
int main()
{
int num = 0;
cin >> num;
int count = 0;
while (num != 0)
{
num = (num - 1) & num;
count++;
}
cout << count << endl;
system("pause");
return 0;
}
例题2:求解一个整数是否是2的整数次方(用一条指令)
这题如果运用上面的方法进行求解,也是比较简单的,首先,若一个数是2的整数次方,那么这个数的二进制位中,一定只有一位是1其他位全是0,那么问题就转换为了,这个数的二进制位中是不是只有一个1,这里可以运用上面的&运算符进行运算,其代码如下:
#include <iostream>
using namespace std;
int main()
{
int num = 0;
cin >> num;
if (((num - 1) & num) == 0) //说明这个数的二进制数中只有一个1
{
cout << "是2的整数次方" << endl;
}
else
cout << "不是2的整数次方" << endl;
system("pause");
return 0;
}