Description
hry进入大学之后学习了二进制,有一天他遇到这样一个问题,判断一个十进制正整数是不是2的幂?
Input
第一行是一个正整数T,表示有T组测试数据。 每组测试数据有一行一个正整数n。
(1<=T<=10000,1<=n<=1000000000000000000)
Output
每组测试数据输出一行,如果n是2的幂,输出Yes,否则输出No.
Sample Input
5
1
2
3
4
5
Sample Output
Yes
Yes
No
Yes
No
解题思路:
这里我们注意到,如果一个十进制正整数n是2的幂的话,那么他写成二进制形式之后,只有一位为1,其余位都为0。这里我们用位运算,将n减去1,则n-1在在原来为1的那一位为0,之后所有位全为1。因此,如果n为2的幂的话,将n跟n-1用位与运算之后,所得结果的二进制表示应该全为0,即十进制也为0。因此这是一个很有效的判定条件。
C++代码:
#include<iostream>
using namespace std;
int main()
{
int T;
cin >> T;
for (int i = 0; i < T; i++)
{
long long n;
cin >> n;
if ((n & (n - 1)) == 0)
{
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
}
return 0;
}
/**************************************************************
Problem: 2580
Language: C++
Result: Accepted
Time:112 ms
Memory:1484 kb
****************************************************************/