Problem:
Given an integer, write a function to determine if it is a power of two.
Summary:
判断一个数n是不是2的整数幂。
Analysis:
这道题首先需要注意n为非整数是返回false的情况。
1. 若将n转换为二进制数,如果n为2的整数幂,则转换得到的二进制数只包含一个一,故计算转换过程中1的个数,最终判断。
1 class Solution { 2 public: 3 bool isPowerOfTwo(int n) { 4 int cnt = 0; 5 6 while (n > 0) { 7 if (n % 2) { 8 cnt++; 9 } 10 n /= 2; 11 } 12 13 return cnt == 1 ? true : false; 14 } 15 };
可以简化为位操作的形式,如下:
1 class Solution { 2 public: 3 bool isPowerOfTwo(int n) { 4 int cnt = 0; 5 while (n > 0) { 6 cnt += (n & 1); 7 n >>= 1; 8 } 9 10 return cnt == 1; 11 } 12 };
2. 经过查网上大牛的代码,学到了一个神奇的技巧:当一个数n为2的整数幂时,其二进制最高位必为1,其余位数都为0。那么n-1最高位为0,其余位数均为1。则若n & (n -1)为0时,n必为2的整数幂。
1 class Solution { 2 public: 3 bool isPowerOfTwo(int n) { 4 return (n > 0) && !(n & (n - 1)); 5 } 6 };