一、位运算常用的两种操作:
(1) 求n的第k位数字:n >> k & 1
(2) 返回n的最后一位1:lowbit(n) =n & -n
二、求n的第k位数字:n >> k & 1 n =15 (1111)2 : 先把第k位移到最后一位 n >> k, 看个位是几 x & 1, n >> k & 1具体实现:
#include<iostream> using namespace std; int main() { int n=10; for(int k=3; k>=0; K--) cout << (n >>i & 1) << endl; return 0; } 三、lowbit是树状数组的基本操作 1. lowbit(x)的作用: 返回x的最后一位 1:(1) x = 1010 lowbit(x) = 10
(2) x = 101000 lowbit(x) = 1000
2. lowbit(x) 的实现过程:x & -x = x & (~x + 1)
-x = ~x + 1
x = 1010 ....10000
~x = 0101 ....01111
~x + 1 = 0101 ....10000
x & (~x + 1) = 0000 ....10000
3. lowbit(x)的应用:求二进制中 1 的个数具体实现:
#include <iostream> using namespace std; int lowbit(int x) { return x & -x; } int main() { int n; cin >> n; while (n--) { int x; cin >> x; int res = 0; while(x) x -= lowbit(x), res++;//每次减去x的最后一位1 cout << res <<endl; } return 0; }