1、相等法(4ms,47%;5.9ms,5.3%)
1 bool isPowerOfTwo(int n) { 2 //反向增加 3 int m=1; 4 //保留原值 5 int num=n; 6 while(n>1){ 7 n/=2; 8 m*=2; 9 } 10 return m==num; 11 }
2、取余法(4ms,47%;5.7MB,90%)
1 bool isPowerOfTwo(int n) { 2 if(n<=0) 3 return false; 4 while(n>1){ 5 if(n%2==1) 6 return false; 7 n/=2; 8 } 9 return true; 10 }
3、二进制判断(4ms,47%;5.8MB,70%)
1 bool isPowerOfTwo(int n) { 2 if(n<=0) 3 return false; 4 if(n==1) 5 return true; 6 7 //2的幂次方的二进制只有一个1 8 //如果n的二进制是1000,那n-1的就是0111 9 //则两者的与运算就是0 10 return (n&(n-1))==0; 11 }
4、二进制判断(0ms,100%;5.7MB,85%)
1 bool isPowerOfTwo(int n) { 2 //-n就是对n的二进制取反再加1 3 //2的幂次方符合判断 4 return (n>=1)&&(n&-n)==n; 5 }