您的位置:首页 > 编程语言 > Java开发

Java移位操作、位运算详解

2017-08-06 13:52 701 查看

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的个数比较少时,这个算法的效率更高。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  位运算 java