如何判断一个数是否是2的n次方
public static boolean isPower(int n){
int i=1; if (n < 1) return false; while (i <= n){
if (i == n){
return true; } i <<= 1; } return false; }
讯享网
上面代码的时间复杂度是O(logn),那么是否存在更高效率的算法呢?
我们可以看一下2,4,8,16等数字的二进制数形式:10,100,1000,10000…这些数有一个共同的特征,都只有一位数是1,其余位为0。所以判断一个数是否是2的n次方可以转换成二进制位是否只有一个数为1。
有了上面的想法就可以给出下面的解决方法了:以8举例
8的二进制数是:1000,(8-1)的二进制数是:0111,相信你已经看出猫腻了,如何我将8和(8-1)进行&操作为0,就可以说明8是2的n次方。
代码实现:
讯享网 public static boolean isPower(int n){
if (n < 1) return false; return (n&(n-1))==0; }
如何求二进制数中1的个数
public static int countOne(int n) {
int count = 0; while (n > 0){
if ((n&1)==0) count++; n >>= 1; } return count; }
上面代码的时间复杂度是0(logn)。另一种思考方式:由于这个题只考虑1的个数,把二进制中每一个1当做一个独立的个体,参照上面第二段代码可以求1的个数。给定一个数n,每次进行 n&(n-1)计算,其结果中都会少一位。
讯享网public static int countOne(int n) {
int count=0; while (n > 0){
if (n > 0){
n = (n&(n-1)); count++; } } return count; }
看不懂的话可以举个例子自己试一试,7:0111。其实个人认为会第一种常见的就行了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/19545.html