位运算

n的二进制表示中第k位是0还是1

1.先把第k位移到最后一位
2.看个位
n >> k & 1

//输出10的每一位
int n = 10;
for(int k = 3; k >= 0; k --) {
    cout << (n >> k & 1); 
}

lowbit(x),得到x的最后一位1

//x = 1010      lowbit(x) = 10
//x = 10011000  lowbit(x) = 1000
//~x表示取反x
//在c++中,-x = ~x + 1
//所以x & -x = x & (~x + 1)
//设个x模拟一遍即可
int lowbit(int x) {
    return x & -x;
}

应用:统计x里1的个数

//第k位
for(int i = 0; i < n; i ++) {
    int res = 0;
    cin >> A[i];
    while(A[i]) {
        if(A[i] & 1) {
            res ++;
        }
        A[i] = A[i] >> 1;
    }
    cout << res << " ";
}
//lowbit
for(int i = 0; i < n; i ++) {
    cin >> A[i];
    int res = 0;
    while(A[i]) {
        A[i] -= lowbit(A[i]);
        res ++;
    }
    cout << res << " ";
}
posted @ 2022-10-13 16:16  wushucan  阅读(8)  评论(0)    收藏  举报