问:判断一个整数是否能表示成2的指数形式
思路:若x是2的指数倍的整数,那它的二进制位串中只有一位是1。
#include <iostream>
using namespace std;
//判断一个整数是否能表示成2的指数形式。要求算法简单。
bool p2(int n)
{
int temp = 0;
int l = sizeof(int) * 8;
//整型的位宽
for (int i = 0; i < l; i++)
temp += (2 << i) & n;
if (temp == n)
return true;
else
return false;
}
int main(int argc, char* argv[])
{
int n;
cin >> n;
if (p2(n))
cout << n << "可以表示成2的指数形式!" << endl;
else
out << n << "不能表示成2的指数形式!" << endl;
return 0;
}
weapon0916兄的意见很有见地,我后来又自己细想了一下,代码改为
bool p1(int n)
{
return (n & (n-1)) == 0 ? true : false;
}
原因我是这样想的: 若x是2的指数倍的整数,那它的二进制位串中只有一位是1。即是说,其他非2的幂次的数—假设是y—的比特串都包含2个以上的1,那么,当n-1时,x位串上的那个1要么移位(向高位借位),要么消失;而y最右边的那个1可能消失(处于0位)也可能向左移(向高位借位),但最左边的那个1一定不会有任何改变,所以x&(x-1) == 0 而 y&(y-1) != 0。