题目描述
给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1 的个数。
输入格式
第一行包含整数 n。
第二行包含 n 个整数,表示整个数列。
输出格式
共一行,包含 n 个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中 1 的个数。
数据范围
1≤n≤100000,
0≤数列中元素的值≤10^9
大体思路
题目上描述要得到数列中每个数中二进制1的个数,那什么可以得到二进制中的1的个数呢?lowbit,我们可以使用lowbit得到数中的最后一个1的位置,然后让原数减去得到的这个二进制,在使用lowbit得到下一个1的位置,在减去,知道这个数的二进制中没有1位置,就是这个数位0,就开始找下一个数,那实现一下代码:
usingnamespacestd; intn; //得到数中最后一位1intlowbit(inta) { returna& (-a); } intmain() { cin>>n; ints=0; intx=0; while (n--) { cin>>x; s=0; while (x)//当x减成0的跳出循环 { x-=lowbit(x);//每次都减去自身二进制位中的最后一位1s++;//减去一位1的同时s++ } cout<<s<<" "; } return0; }