1. 程式人生 > 實用技巧 >lowbit運算加Hash找出整數二進位制表示下所有是1的位

lowbit運算加Hash找出整數二進位制表示下所有是1的位

預備知識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     int
n; 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運算是樹狀陣列的一個基本操作,在之後會學到