Java移位操作、位运算详解

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lujianhao_ios/article/details/76767981

1、如何用移位操作实现乘法运算

把一个数向左移动n位相当于把该数乘以2的n次方,因此当乘法运算中的某一个数字满足这个特点时,就可以用移位操作来替代乘法操作,从而提高效率。

实例如下:

public class Test {

    public static int powerN(int m,int n){
        for (int i=0; i<n; i++)
            m = m<<1;
        return m;
    }
    public static void main(String[] args){

        System.out.println("3乘以8="+powerN(3,3));
        System.out.println("3乘以16="+powerN(3,4));

    }
}

程序运行结果为:

3乘以8=24
3乘以16=48

2、利用移位操作判断一个数是否为2的n次方

2的n次方可以表示为:2^0,2^1,2^2,···,2^n。最直观的思想是用1做移位操作,然后判断移位后的值是否与给定的数相等。

实例如下:

public class Test {

    public static boolean isPower(int n){
        if (n<1) return false;
        int i = 1;
        while (i<=n){
            if (n==i)
                return true;
            i = i<<1;
        }
        return false;
    }

    public static void main(String[] args){

        System.out.println(isPower(4));
        System.out.println(isPower(6));

    }
}

程序运行结果为

true
false

3、如何求二进制中1的个数

问题描述:给定一个整数,输出这个整数二进制表示中1的个数,例如,给定整数7,其二进制表示为111,因此输出结果为3.
该问题可以采用位操作来完成。具体思路如下:首先,判断这个数的最后一位是否为1,如果为1,则计数器加1,然后,通过右移丢弃掉最后一位。循环执行该操作直到这个数等于0为止。在判断二进制表示的最后一位是否为1时,可以采用与运算来达到这个目的。

实例如下:

public class Test {

    public static int countOne(int n){
        int count = 0;
        while (n>=1){
            if ((n&1)==1) //判断最后一位是否为1
                count++;
            n = n>>1;
        }
        return count;
    }

    public static void main(String[] args){

        System.out.println(countOne(7));
        System.out.println(countOne(8));

    }
}

程序运行结果为

3
1

以上这个算法的时间复杂度为O(n),其中n代表二进制数的位数。由于题目要求求出1的个数,此时可以只考虑1的个数,把二进制表示中的每个1看成独立的个体。给定一个数n,每进行一次n&(n-1)计算,其结果中都会少了一位1,而且是最后一位。

利用这个特性可以编写出如下代码:

public class Test {

    public static int countOne(int n){
        int count = 0;
        while (n>=1){
            if (n>=1){ //判断最后一位是否为1
                n=n&(n-1);
                count++;
            }
        }
        return count;
    }

    public static void main(String[] args){

        System.out.println(countOne(7));
        System.out.println(countOne(8));

    }
}

程序运行结果为

3
1

改进后的算法时间复杂度为O(m),其中m为二进制数中1的个数,显然在二进制数中1的个数比较少时,这个算法的效率更高。

展开阅读全文

没有更多推荐了,返回首页