二进制中1的个数-java

主要通过位运算来完成两个基本操作,查询一个数的二进制数第k位数是什么,和lowbit操作返回一个二进制数中最右边的1所对应的数值,可以用来统计二进制中1的个数。

目录

前言

一、二进制中1的个数

二、算法思路

1.将一个整数转化成二进制形式

2.查询一个数的二进制数中的第k位是多少

3.lowbit(x)操作

三、代码如下

1.代码如下:

2.读入数据

3.代码运行结果

4.样例解释

总结


前言

主要通过位运算来完成两个基本操作,查询一个数的二进制数第k位数是什么,和lowbit操作返回一个二进制数中最右边的1所对应的数值,可以用来统计二进制中1的个数。

一、二进制中1的个数

给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1 的个数。

输入格式

第一行包含整数 n。

第二行包含 n 个整数,表示整个数列。

输出格式

共一行,包含 n 个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中 1 的个数。

数据范围

1≤n≤100000

0≤数列中元素的值≤1000000000

二、算法思路

1.将一个整数转化成二进制形式

图1.1示例图

将一个十进制数转换为二进制字符串,可以采用"除2取余数"的方法。具体步骤如下:

(1)将数字除以2。

(2)获取下一次迭代的整数商。

(3)获取其余的二进制数字。

(4)重复这些步骤,直到商等于0。

(5)将得到的所有余数全部排列起来,再将它反过来(逆序排列)。

上述图1.1中15的二进制数就是1111。

2.查询一个数的二进制数中的第k位是多少

图2.1示例图

我们需要查看哪一位二进制数,只需要这个数右移多少位然后再与1做与运算即可。查看第1位就是这个数右移0位再与1做与运算;第2位是右移1位再与1做与运算后续以此类推。

java 复制代码
         int x = 10;
         for(int i = 3;i >= 0;i--){
             pw.printf("%d",x >> i & 1);
         }
           
          
        运行结果: 1010

3.lowbit(x)操作

lowbit(x)函数的作用就是一个二进制数中最右边的1所对应的数值。

例如: x = 1010 lowbit(x) = ,返回值是int对应的十进制是2;

x = 10010000 lowbit(x) = ,返回值是对应的十进制是16。

图3.1与运算模拟

在计算机中我们常用补码来表示数据,其中第一位是符号位1表示正数,0表示负数。正数的原码、反码、补码全部相同;负数的反码是原码除了符号位全取反,补码是反码加1;从上述图3.1的过程中我们可以知道任意x和-x的补码对应的关系是-x的补码是x的补码连带符号位取反加1,最后二进制数中的最后一位1的后面x和-x相等,在二进制数中的最后一位1前面x和-x互相取反。

那么,进行与运算后二进制数中的最后一位1前面全部变成0,二进制数中的最后一位1后面的不变,此时就是二进制数中x的最后一位1和后面的二进制数。

注:(与运算 1 & 0 = 0 、0 &1 = 0、1 & 1 = 1 、 0 & 0 = 0)

java 复制代码
    //lowbit操作返回一个二进制数中最右边的1所对应的数值
    public static int lowbit(int x){
        return x & -x;
    }

三、代码如下

1.代码如下:

c 复制代码
import java.io.*;
public class 位运算 {
    static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
    public static void main(String[] args) throws Exception{
        int n = nextInt();
        while(n-- > 0){
            int x = nextInt();
            int res = 0;
            while(x != 0){
                //每一次减去x里面的最后一位1对应的数值,减了多少次就有多少个1
                x -= lowbit(x);
                res++;
            }
            pw.print(res+" ");
        }
        pw.flush();
    }
    public static int lowbit(int x){
        return x & -x;
    }
    public static String next()throws Exception{
        return br.readLine();
    }
    public static int nextInt()throws Exception{
        st.nextToken();
        return (int)st.nval;
    }
}

2.读入数据

c 复制代码
5
1 2 3 4 5

3.代码运行结果

java 复制代码
1 1 2 1 2 

4.样例解释

1对应的二进制为1,1的个数是1。

2对应的二进制为10,1的个数为1。

3对应的二进制为11,1的个数为2。

4对应的二进制为100,1的个数为1。

5对应的二进制为101,1的个数为2。


总结

主要通过位运算来完成两个基本操作,查询一个数的二进制数第k位数是什么,和lowbit操作返回一个二进制数中最右边的1所对应的数值,可以用来统计二进制中1的个数。

相关推荐
JingHongB几秒前
代码随想录算法训练营Day55 | 图论理论基础、深度优先搜索理论基础、卡玛网 98.所有可达路径、797. 所有可能的路径、广度优先搜索理论基础
算法·深度优先·图论
weixin_432702263 分钟前
代码随想录算法训练营第五十五天|图论理论基础
数据结构·python·算法·深度优先·图论
小冉在学习6 分钟前
day52 图论章节刷题Part04(110.字符串接龙、105.有向图的完全可达性、106.岛屿的周长 )
算法·深度优先·图论
Repeat7157 分钟前
图论基础--孤岛系列
算法·深度优先·广度优先·图论基础
小冉在学习9 分钟前
day53 图论章节刷题Part05(并查集理论基础、寻找存在的路径)
java·算法·图论
y5236489 分钟前
Javascript监控元素样式变化
开发语言·javascript·ecmascript
武子康21 分钟前
大数据-212 数据挖掘 机器学习理论 - 无监督学习算法 KMeans 基本原理 簇内误差平方和
大数据·人工智能·学习·算法·机器学习·数据挖掘
IT技术分享社区39 分钟前
C#实战:使用腾讯云识别服务轻松提取火车票信息
开发语言·c#·云计算·腾讯云·共识算法
极客代码42 分钟前
【Python TensorFlow】入门到精通
开发语言·人工智能·python·深度学习·tensorflow
疯一样的码农1 小时前
Python 正则表达式(RegEx)
开发语言·python·正则表达式