2020/10/4 Acwing-lowbit

该博客介绍了如何利用LowBit算法解决编程问题,即计算一个整数在二进制表示中1的个数。文章详细解释了LowBit算法的原理,涉及到补码的概念,并给出了具体的Java源代码实现。通过对输入数字进行位操作,可以高效地计算每个数的二进制中1的个数,满足大规模数据处理的需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

给定一个长度为n的数列,请你求出数列中每个数的二进制表示中1的个数。
输入格式
第一行包含整数n。
第二行包含n个整数,表示整个数列。
输出格式
共一行,包含n个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中1的个数。
数据范围
1≤n≤100000,
0≤数列中元素的值≤109
输入样例:
5
1 2 3 4 5
输出样例:
1 1 2 1 2

题目分析

题目的要求其实就是想要知道输入的数字的二进制表示中,包含多少个1.对于本题,有一种解法-lowbit.顾名思义,能够通过这种算法,找到输入数字的二进制的表示的 从低位算起第1个1,并返回.简言之,返回的是1后若干个零,如果输入的是10010000,那么返回的就是10000.

算法解析

lowbit算法:利用的是补码.如果输入的是x,那么-x其实在计算机内是以补码的形式存储的,也即是取反+1.而不论输入的是什么数,经过取反+1,只有低位是1000...这种形式的取反+1才不变,而其余任何的位都取反了,也就意味着之后低位是1000...这种形式的才值不变,其余位都已经变成了0.
因此
x&(-x)
得到的数就是原数的lowbit.(当然是int类型的)
更近一步的,如果想要得到各个数字的二进制的各个位数的值,其实要做的就是移位操作. 如果想到得到第i位(从低位开始数起,第0位就是最低位数),只需要将此数向右移位i位>>i,这样想要的位数其实就到了最低位,取这个数的操作就是对其做&1操作
也就是
x>>i&1
就会得到x的二进制第i位

源代码

import java.util.Scanner;
class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        while(n-->0){
            int x=sc.nextInt();
            int temp;
            int count=0;
            while( (temp=x&(-x))!=0){
            count++;
            x-=temp;
            }
            System.out.print(count+" ");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值