public class BitOperation {
/**
* 用移位操作实现乘法运算:把一个数向左移动n位相当于把概数乘以2的n次方,因此当乘法运算中的某个数字满足这个特点时,
* 就可以用移位操作来代替乘法操作,从而提高效率。
*/
public int powerN(int m,int n){//m乘以2的n次方
for(int i=0;i<n;i++){
m=m<<1;
}
return m;
}
/**
* 如何判断一个数是否为2的n次方
* 方法1:用1做移位操作,然后判断移位后的值是否与给定的数相等;
* 方法2:利用m&(m-1)是否为0来判断,若为0则m是2的n次方,若不为0则m不是2的n次方
*/
public boolean isPower1(int m){
if(m<1) return false;
int i=1;
while(i<=m){
if(i==m){
return true;
}
i<<=1;
}
return false;
}
public boolean isPower2(int m){
if(m<1) return false;
return (m&(m-1))==0;
}
/**
* 如何求二进制数中1的个数
* 思路:首先,判断这个数的最后一位是否为1,如果为1,则计数器加1;然后,通过右移丢弃掉最后一位。
* 循环执行该操作直到这个数等于0为止。
*/
public int countOne1(int m){
int count=0;//计数器
while(m>0){
if((m&1)!=0)//判断最后一位是否为1
count++;
m>>=1;//右移一位
}
return count;
}
//方法2:通过m=m&(m-1)实现每次去除m中的最后一个1
public int countOne2(int m){
int count=0;
while(m>0){
count++;
m=m&(m-1);
}
return count;
}
public static void main(String [] args){
BitOperation bo=new BitOperation();
System.out.println(bo.countOne2(8191));
}
}
本博客内容来自《Java程序员面试笔试宝典》