801. 二进制中1的个数
位运算模板
模板
lowbit(x)是x的二进制表达式中最低位的1所对应的值。
比如,6的二进制是110,所以lowbit(6)=2。
最近回头看树状数组,发现关于lowbit()函数,目前有两种算法。
第一种是比较常见的,也是我一直在用的:1
2
3
4int lowbit(int x)
{
return x&(-x);
}
最近发现了另一种算法,如下所示:
1 | int lowbit(int x) |
两种算法的结果都是对的。
相比之下,第一种算法利用了负整数的补码特性,非常的巧妙,而第二种算法用另外一种方式计算出了最低位,其思想跟补码的也很相似。当然还是推荐第一种,不仅巧妙而且好记。
题目描述:
给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1 的个数。
输入格式
第一行包含整数 n。
第二行包含 n 个整数,表示整个数列。
输出格式
共一行,包含 n 个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中 1 的个数。
数据范围
1≤n≤100000,
0≤数列中元素的值≤109
输入样例:
```1 2 3 4 5
输出样例:
1 1 2 1 2
1 |
|
1 |
|
此文章版权由chen-yisen所有,如有转载,请注明明來自原作者