位元

%2 /=2 & | << >> __builtin_popcount

位元運算

/*
 * example
*/
#include <iostream>
using namespace std;

int main() {
    int a = 5; // 0101
    int b = 3; // 0011
    
    cout << a | b << endl;

    // AND
    cout <<  a & b << endl;

    // XOR
    cout << a ^ b << endl;

    // NOT
    cout << ~a << endl;
    
    return 0;
}

除2法

/*
 * zerojudge
 * a414. 位元運算之進位篇
 * C++
 * AC (0.9s, 332KB)
*/
#include<bits/stdc++.h>
using namespace std;
#define fastio ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

int main(){
	fastio;
	int n;
	while(cin >> n){
		if(n==0){
			break;
		}
		//
		int cnt=0;
		while(n){
			if(n%2==1){
				cnt++;
			}else{
				break;
			}
			n/=2;
		}
		cout << cnt << endl;
	}
}

求二進制數字中幾個 1

/*
 * example
*/
#include <iostream>
using namespace std;

int main() {
    int num;
    cin >> num;
    int count = __builtin_popcount(num);
    cout << count << endl;
    return 0;
}

位元掩碼

/*
 * AP325
 * Q-2-7. 互補團隊
*/
#include<bits/stdc++.h>
using namespace std;

int main() {
    int m, n;
    cin >> m >> n;

    vector<int> mask(n, 0);
    for (int i = 0; i < n; i++) {
        string s;
        cin >> s;
        for (char c : s) {
            mask[i] |= (1 << (c - 'A'));
        }
    }

    int ans = 0;
    for (int i = 0; i < n; i++) {
        for (int k = i + 1; k < n; k++) {
            int combined_mask = mask[i] | mask[k];
            if (__builtin_popcount(combined_mask) == m) {
                ans++;
            }
        }
    }

    cout << ans/2 << endl;
    return 0;
}

Last updated

Was this helpful?