• 求一个数二进制中包含多少个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");
    	}
    	
    	
    
    	
    }
    
    
    }
    

      

  • 相关阅读:
    最小生成树
    图论最短路径例题
    广搜例题
    这些搜索套路好深。。。
    高斯消元part2
    高斯消元与行列式求值 part1
    2020/4/24
    实时的眼部追踪
    2020/4/23
    2020/4/22
  • 原文地址:https://www.cnblogs.com/xuexidememeda/p/12774352.html
Copyright © 2020-2023  润新知