求最大连续bit数

求最大连续bit数

/*
2022年09月21日 11:43:09
利用flag标记前一位是否为1
count统计的是当前区间内连续1的个数
每一次统计后存进vector中
当前位不是1的时候,count置0
最后输出vector最大的count
*/
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int n;
    cin >> n;
    bool flag = false; // 标记当前bit位是1
    int count = 0; // 统计连续的1
    vector<int> v(32); // 记录当前最大的count
    for(int i = 0; i < 32; ++i){
        if(n & (1<<i)){ // 当前位是1
            if(flag){ // 前一位也是1
                ++count;
                v[i] = count;
            }
            else{
            flag = true; // 标记当前位是1
            count = 1;
            v[i] = count;
            }
        }
        else{ // 当前位不是1
            flag = false;
            count = 0;
            v[i] = count;
        }
    }
    int maxCount = 0;
    for(auto e : v)
        maxCount = max(maxCount, e);
    cout << maxCount << endl;
    return 0;
}
/*
2022年09月21日 11:43:09
模2除2就可以不断判断最后一位是否为1
统计连续的1个数
不为1的时候,连续1中断了,count重置为0
并更新maxCount
最后n判断完了再更新一次maxCount
时间复杂度O(logN)
空间复杂度O(1)
*/
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    int n;
    cin >> n;
    int count = 0; // 统计连续1的个数
    int maxCount = 0; // 最大连续1个数
    while(n){
        if(n%2 == 1) // 最后一位为1
            ++count;
        else{
            maxCount = max(count, maxCount);
            count = 0;
        }
        n /= 2; // 去除最后一位
    }
    maxCount = max(count, maxCount);
    cout << maxCount << endl;
    return 0;
}
/*
2022年09月21日 11:43:09
位运算
一个数和自己左移一位进行位与运算,
相当于喝自己错开的一位进行与运算,
如果有连续的1,错位位与之后就少一个1,此时count++
如果没有连续的1,错位位与之后就是0,
时间复杂度O(logN)
空间复杂度O(1)
*/
#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;
    int count = 0;
    while(n){
        n &= n << 1;
        ++count;
    }
    cout << count << endl;
    return 0;
}

补充:
如果想求一个数二进制位有几个1,用n与n-1与运算。
n &= n-1;