package JBBit;
public class BitTest {
/**
* 移位实现乘法(2的n次方)操作
* 左移n位
*/
public static int powerN(int m, int n){
for (int i = 0; i < n; i++) {
m = m<<i;
}
return m;
}
/**
* 判断是否是2的n次方
* 如果一个数是2的n次方
* 那么这个数对应的二进制表示只有一位是1,其余位是0
* 如:num = 00010000
* 那么num-1 = 00001111
* 每一位都不相同
* num&num-1结果为0
* 利用这一特点来判断
*
*/
public static boolean isPower(int n){
if(n<1) return false;
int m = n & (n-1);
return m==0;
}
/**
* 二进制中1的个数
* 方法1:
* 判断这个数最后一位是否为1,如果为1,计数器加1
* 然后右移丢弃掉最后一位
* 循环执行该操作直到这个数等于0为止
* 算法复杂度O(n)
* 方法2:
* 判断最后一位是否为1的方法为n&(n-1)
*
* @param n
* @return
*/
public static int countOne1(int n){
int count = 0;
while(n>0){
if ((n&1)==1) {//判断最后一位是否为1
count++;
}
n>>=1;//移位
}
return count;
}
public static int countOne2(int n){
int count = 0;
while(n>0){
if (n!=0) {//判断最后一位是否为1
n = n&(n-1);
count++;
}
n>>=1;//移位
}
return count;
}
public static void main(String[] args) {
System.out.println(powerN(5, 2));
System.out.println(isPower(3));
System.out.println(countOne1(15));
System.out.println(countOne2(15));
}
}