首页 > 其他 > 详细

leetcode_power of 2/3 位运算

时间:2016-03-12 22:34:01      阅读:133      评论:0      收藏:0      [点我收藏+]

判断一个数是否是2的次方:

 public boolean isPowerOfTwo(int n) {
        if(n<0||n==0) return false;
        int remainder=n%2;
        int s=n/2;
        while(remainder==0){//remainder为0时继续做除法
            remainder=s%2;
            s=s/2;
        }
        if(s==0) return true;//remainder不为0,此时看s是否变成0
        return false;
    }

有bit解决方法,一个数如果是2的次方,那么二进制表达式为1后面跟若干个0,此时如果减1,则除高位外其他位均为1,将得到的新数与原数做与运算,得0,判断其为2的次方

public boolean isPowerOfTwo(int n) {
        return (n>0)&&(n&(n-1))==0;//用位运算做题
    }

与之类似:power of three:

public boolean isPowerOfThree(int n) {
        if(n<0||n==0) return false;
        int remainder=n%3;
        int s=n/3;
        while(remainder==0){//remainder为0时继续做除法
            remainder=s%3;
            s=s/3;
        }
        if(s==0&&remainder==1) return true;//注意这里不能仅仅判断s是否为0,还要判断remaider是否为1,因为还存在remainder为2的情况,此时n并不是3的次方数
        return false;
    }

对于数字6,

6/3=2......0

2/3=0......2如果仅仅判断s==0,出错!在判断是否是2的次方数时,由于余数只可能是0,1所以不用对remainder进行判断,同理如果要判断一个数是否为4的次方数也要对remainder是否为1进行判断。

*********************************************

对于一个整数,求出二进制表达式中1的个数。利用Integer中的toBinaryString函数将整数转换为字符串形式:

 public int hammingWeight(int n) {
        String s=Integer.toBinaryString(n);
        int count=0;
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)==‘1‘)
                count+=1;
        }
        return count;
    }

********************************************

reverse Bits:

Reverse bits of a given 32 bits unsigned integer.

For example, given input 43261596 (represented in binary as 00000010100101000001111010011100), return 964176192 (represented in binary as 00111001011110000010100101000000).注意:输入n=1时: 转换成1 (00000000000000000000000000000001),然后输出: 2147483648 (10000000000000000000000000000000),所以下图&&&&&处是31-i,但是如下代码是有错的!!!这在于double型存储的形式,2的31次方表示为:2.147483648E9,所以会出错!

 public int reverseBits(int n) {
        double result0=0.0;
        String s=Integer.toBinaryString(n);
        int len=s.length();
        for(int i=0;i<len;i++){
            result0+=Math.pow(2,31-i)*(s.charAt(i)-48);//&&&&&&&&
        }
        String s1=String.valueOf(result0);
        int index=s1.lastIndexOf(".");
        int result=Integer.parseInt(s1.substring(0,index));
        return result;
        
    }

必须用位运算解答此题。

leetcode_power of 2/3 位运算

原文:http://www.cnblogs.com/litian0605/p/5270228.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!