lowbit運算加Hash找出整數二進位制表示下所有是1的位
阿新 • • 發佈:2020-10-28
預備知識https://www.cnblogs.com/fx1998/p/12826831.html
當輸入的數n較小時,直接開一個數組H
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 1 << 20; 4 //2 ^ 20 = 1048576 5 int H[N + 10]; 6 int main() { 7 for (int i = 0; i <= 20; i++) { //預處理 8 H[1 << i] = i; 9 } 10 int n;11 while (cin >> n) { 12 while (n > 0) { 13 cout << H[n & -n] << " "; 14 n -= n & -n; 15 } 16 cout << endl; 17 } 18 return 0; 19 }
執行結果及解釋:
然後根據二進位制碼8421
9的二進位制表示為 1001
7的二進位制表示為 0111
4的二進位制表示為 0100
然後從右往左從0開始數的話:
9的第0位,第3位是1,所以輸出0 3
7的第0位,第1位是1,第2位是1,所以輸出0 1 2
4的第2位是1,所以輸出2
然後是稍微複雜但效率更高的方法
1 #include <bits/stdc++.h> 2 using namespace std; 3 //2 ^ 35 = 34,359,738,368。要開long long 4 int H[37]; 5 int main() { 6 for (int i = 0; i < 36; i++) { //預處理 7 H[(1ll << i) % 37] = i; 8 } 9 intn; 10 while (cin >> n) { 11 while (n > 0) { 12 cout << H[(n & -n) % 37] << " "; 13 n -= n & -n; 14 } 15 cout << endl; 16 } 17 return 0; 18 }
lowbit運算是樹狀陣列的一個基本操作,在之後會學到