求一个数二进制中包含多少个1

public class Test1 {
    /*
     * 求一个数二进制中包含多少个1  例如 2二进制是10 包含一个1
     * 
     * 1.<<:左移 左边最高位丢弃,右边补齐0
        
        2.>>:右移 最高位是0,左边补齐0;最高为是1,左边补齐1
        
        3.>>>:无符号右移 无论最高位是0还是1,左边补齐0
     * */
    
    public static void main(String[] args) {
        name2();
        
    }
    
    public static void name1() {
        //方法二把原数右移移一位    具体想想怎么与的
        // 0000 0000 0000 0000 0000 0000 0000 1010 
        // 0000 0000 0000 0000 0000 0000 0000 0001
    
        int a=-2;
        int count=0;
        
        for (int i = 0; i < 32; i++) {
            if (((a>>>i)&1)==1) {
                ++count;
            }
        }
        
        System.out.println(count);
    }
    public static void name() {
        // 方法一把1左移一位(左移后面补0)& 原数 == 1 左移一位的话就存在1  ;
           // 0000 0000 0000 0000 0000 0000 0000 1010 
           // 0000 0000 0000 0000 0000 0000 0000 0001
        int a=10;
        int count=0;
        
        for (int i = 0; i < 32; i++) {
            if ((a&(1<<i))==(1<<i)) {
                ++count;
            }
        }
        
        System.out.println(count);
        
    }
    public static void name2() {
        /*
         * 
         * 这个思路是 例如10 二进制 1010   
         * 如果一个数a=(a-1)& a 一直循环去肯定得到的是0  反正真的不好想到这种憨批的方法 ( (a-1)& a 消除最低位1因为
         * 0111 和1000 相差1 )
         * 
         *     1010
         *    -0001
         *    -------
         *     1001
         *  &  1010
         *  ----------
         *     1000
         *  -  0001
         *  ---------
         *     0111
         *     1000
         *  &-----------
         *         0
         * 
         * */
        
        int a=10;
        int count=0;
        while (a!=0) {
            a=(a-1)&a;
            count++;
            
        }
        System.out.println(count);
        
    }
}

 

 

 

 

判断一个整数是不是2的整数次方(如果换成2进制 就是判断二进制位上的数只包含一个1)

这个最简单的方法 是 (a-1)&a 这个是消除最低位1   假如二进制位只有一个1 那么消除后就成0了  因此 (a-1)&a==0

public class Test2 {
	/*
	 * 判断一个整数是不是2的整数次方(如果换成2进制 就是判断二进制位上的数只包含一个1)
	 * 
	 * 
	 * 
	 * */
public static void main(String[] args) {
	//或者可以用位运算 判断有几个1 有1个一的话为2的次方
	int a=1;
	if (((a-1)&a)==0) {
		System.out.println("是2的整数次方");
		
	}else {
		System.out.println("NO");
	}
	
	

	
}


}

  

 

posted @ 2020-04-25 18:18  乌拉乌拉!!!  阅读(583)  评论(0编辑  收藏  举报