lowbit() 运算

【算法】

  lowbit()运算取出非负整数n二进制表示下最低位的1及其后的0表示的值:

    对n按位取反后加1(即补码操作,-n),最低位1即其后位的表示不变,而之前的每一位均取反了,于是按位与即得到所需的值。

    

(~n + 1) & n 等价于 (-n) & n

  

【应用】

  1.树状数组

  2.配合Hash找出n二进制表示下为1的位

 1 #include <bits/stdc++.h>
 2 #define MAX_N  1<<20
 3 using namespace std;
 4 int n;
 5 int H[MAX_N + 1];
 6 int main()
 7 {
 8     for(int i = 0; i <= 20; i++)
 9         H[i << 1] = i;   //2的i次方下标处存i,预处理
10     while(cin >> n) {
11         while(n > 0) {
12             cout << H[n & -n] << ' ';
13             n -= n & -n;
14         }
15     }
16     return 0;
17 }
原文地址:https://www.cnblogs.com/Willendless/p/9309343.html