6.位运算
两个基本位运算技巧:
- 求n的第k位数字:
- 返回n的最后一位1:lowbit()
1.求n(二进制)的第k位数字:n >> k & 1
(默认下标从0开始)
- 原理:
例:求10二进制的第三位数字
n = 10 = (1010)2
n >> 3 = (1)2
n >> 3 & 1 = 1
则:10的二进制的第三位是1。
2.返回n的最后一位1/lowbit
- lowbit原理: X & -X
例:求10二进制的最后一位1的数的大小
n = 10 = (1010)2
-n = ~n + 1 = (0101)2 + 1 = (0110)2
n & -n = (0010)2
则:10二进制的最后一位1的数的大小为2/(10)2
– 示例题目:
给定一个长度为 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>
#include <vector>
using namespace std;
const int N = 100010;
int lowbit(int x) return x & -x;
int main() {
int n;
cin>>n;
while (n--) {
int x, res = 0;
cin>>x;
while (x) {
x -= lowbit(x);
res++;
}
cout<<res<<" ";
}
cout<<endl;
return 0;
}