位运算
n 的 二进制表示中第K位是几
n = 15 = (1111)2
- 先把第K位移动到最后一位 n >> k
- 看个位是几 x & 1
(1)和(2)操作合并
n >> k & 1
代码
#include <iostream> using namespace std; int main() { int n = 10; for (int k = 3; k >=0; k --) cout << (n >> k & 1); return 0; }
lowbit(x) :返回x的最后一位1
x & -x =
x &(~x + 1)
- 在c ++中,一个整数的求反,就是这个数的反码在加1;
作用:统计x中1的个数
题目
给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1 的个数。
输入格式
第一行包含整数 n。
第二行包含 n 个整数,表示整个数列。
输出格式
共一行,包含 n 个整数,其中的第 i个数表示数列中的第 i 个数的二进制表示中 1 的个数。
数据范围
1 ≤ n ≤ 100000
0 ≤数 列中元素的值 ≤ 109输入样例:
5 1 2 3 4 5
输出样例:
1 1 2 1 2
代码
#include <iostream> using namespace std; int n; int lowbit(int x) { return x & -x; } int main() { cin >> n; while (n --) { int x; cin >> x; int res = 0; while (x) x -= lowbit(x), res ++; cout << res << " "; } return 0; }