• 位运算-二进制中1的个数(三种解法)


    题目一:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。如9的二进制表示为1001,有2位是1.

      实例代码:

    import java.util.Scanner;
    
    public class 二进制中1的个数 {
    
    	public static void main(String[] args) {
    		Scanner scanner = new Scanner(System.in);
    		int N = scanner.nextInt();
    		System.out.println(Integer.toString(N,2));  // 输出二进制数
    		
    		//解法一 
    		int count = 0;
    		// 比对每一位
    		for (int i = 0; i < 32; i++) {
    			if ((N&(1<<i))==(1<<i)) {
    				count++;
    			}
    		}
    		System.out.println(count);
    		
    		//解法二
    		count = 0;
    		for (int i = 0; i < 32; i++) {
    			if (((N>>>i)&1)==1) {               // >>> 运算符用 0 填充高位;>> 运算符用符号位填充高位,没有<<<运算符
    				count++;
    			}
    		}
    		System.out.println(count);
    		
    		//解法三  把一个整数n减去1,再和原来的整数与运算,会把该整数的最右边的1变成0,
    		// 那么,一个整数的二进制中有多少个1,就可以进行多少次这样的操作。循环结束的条件是n为0
    		count = 0;
    		while(N!=0){
    			N = ((N-1)&N);
    			count++;
    		}
    		System.out.println(count);
    	}
    
    }
    

      运行结果:

        

    题目二:用一条语句判断一个整数是不是2的整数次方。

      思路:一个整数如果是2的整数次方,那么它的二进制表示中有且仅有一个位是1,而其他所有位都是0,根据上面解法三的分析,把这个整数减去1后再与自己相与,唯一的1也会变成0.注意这里不用考虑2的-1次方之类,因为2的-1次方等与0.5,是一个浮点数,与题目不符。

      实例代码:

    import java.util.Scanner;
    
    public class Test {
    	// 异或运算
    	public static void main(String args[]){
    		Scanner scanner = new Scanner(System.in);
    		int N = scanner.nextInt();
    		System.out.println(Integer.toString(N,2));
    		if (((N-1)&N)==0) {   // 关键一条语句
    			System.out.println("True");
    		}else {
    			System.out.println("False");
    		}
        }
    }
    

      运行结果:

        

  • 相关阅读:
    未授权访问漏洞总结
    常见的端口速查
    Memcache未授权访问漏洞利用及修复
    Ubuntu 16.04 LTS安装Docker
    Ubuntu安装Python2+Python3
    不直接登录SharePoint服务器,通过远程直接部署WSP解决方案包
    SharePoint 2010 人员选择器搜索范围的限定
    SharePoint 2010 匿名访问开启后不能访问Allitems.aspx或DisplayForm.aspx
    博主跑路了
    【pwnable.tw】 alive_note
  • 原文地址:https://www.cnblogs.com/xiaoyh/p/10249006.html
Copyright © 2020-2023  润新知