zoukankan      html  css  js  c++  java
  • 位运算-二进制中1的个数

    &(与)运算特点:

    定义:参加运算的两个数据,按二进制位进行“与”运算。

    运算规则:

    0&0=0  0&1=0  1&0=0  1&1=1

    总结:两位同时为1,结果才为1,否则结果为0

    例如:3&5 即 0000 0011& 0000 0101 = 0000 0001,因此 3&5 的值得1。

    注意:负数按补码形式参加按位与运算。

    与:都为1结果为1

    题目

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

    解题思路

    这里的题目有三种解法,先从最基本的说 探测某一位是否为1,先拿1从左到右运算,整数无非就是32位,所以这里的思路就是32位循环,每一次将1移动到相应的位置上,和二进制数进行 &(与) 运算。

    看图解法一

    假设我们设N为整数, 1向左进行位运算可得一下计算公式:

    (N&(1<<i))==(1<<i)

    解法二

      如下公式:

    ((N>>>i)&1)==1

    解法三

    如下公式:
    N=((N-1)&N)





    代码实现:
    import java.util.Scanner;
    
    public class three{
    //题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。列:9的二进制表示为1001,有2位是1
        public static void main(String args[]){
            //java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入
            Scanner sc = new Scanner(System.in);
            int N = sc.nextInt();
            //创建Integer对象,并通过toString()方法获取到整数N的二进制无符号整数形式;
            System.out.println(Integer.toString(N,2));
    
            //用count初始化作为计算1的次数
            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){
                    count++;
                }
            }
            System.out.println(count);
    
            //解法三
            count=0;
            while(N!=0){
                N=((N-1)&N);
                count++;
            }
            System.out.println(count);
    }
    
    }


  • 相关阅读:
    点滴线程(笔记)
    解决问题的思维方式之Problem->Desgin->Solution(笔记)
    阿朱分享:中国互联网十五年的22个创新模式(转)
    .NET JSON对象序列化和反序列化
    Centos防火墙设置
    跨平台的 NodeJS 组件解决 .NetCore 不支持 System.Drawing图形功能的若干问题
    Mysql 多行转一行
    redis中的缓存穿透 缓存击穿 缓存雪崩
    redis持久化
    redis事物
  • 原文地址:https://www.cnblogs.com/daiorz/p/12732011.html
Copyright © 2011-2022 走看看