位运算:二进制中1的个数
常用操作: 1.求n的第k位数字: n >> k & 1 2.返回n的最后一位1: lowbit(n) = n & ( - n ) lowbit(x)是树状数组里面的常规操作 在二进制中x是原码,-x是反码,-x+1是补码: 题目链接:https://www.acwing.com/problem/content/803/ 给定一个长度为n的数列,请你求出数列中每个数的二进制表示中1的个数。 数据范围 1≤n≤100000, 0≤数列中元素的值≤109 输入样例: 5 1 2 3 4 5 输出样例: 1 1 2 1 2 思路 :既然lowbit(x)可以直接返回x二进制最后一个1的位置代表的数,那么我们就可以利用这个性质来得到x的二进制里1的个数了。 代码实现: # include <bits/stdc++.h> using namespace std ; # define lowbit(x) x & (- x) int main ( ) { ios :: sync_with_stdio ( 0 ) ; cin . tie ( 0 ) ; cout . tie ( 0 ) ; int n ; cin >> n ; while ( n -- ) { int x ; cin >> x ; int ans = 0 ; while ( x ) x - = lowbit ( x ) , ans