【算法】
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 }