【牛客】求最大连续bit数

题目描述
功能: 求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1

输入: 一个byte型的数字

输出: 对应的二进制数字中1的最大连续数

示例1
输入

3
输出

2

方法一:

【题目解析】 考察位运算
【解题思路】 先将输入数字的每一个二进制位取出在连续的放进一个数组,然后在用循环的方法计算数组中连续出现1的次数。注意计算完一段连续的1之后要把计数变量置0,且保存最大的计数

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main()
{
	int num = 0;
	while (cin >> num)
	{
		vector<int>v(32, 0);  //创建一个size()为32的数组 存放32位的bit位
		for (int i = 0; i < 32; i++)
		{
			v[31 - i] = num % 2; // 从后往前进行存入数组
			num /= 2; // 取下一位的bit位
		}
		int count = 0;
		int max = 0;
		for (int i = 0; i < 32; i++)
		{
			count = 0;  //对于每一次 都要讲count初始化为0, 从0开始计数
			while (i<32 && v[i] == 1) //如果连续为1 则计数count++, 同时i++判断下一个bit位是否为1
			{

				count++;
				i++;

			}

			if (count > max)  // max存储每一次计算的count的最大值
			{
				max = count;
				    //注意count不能放在这里
			}

		}
		cout << max << endl;
	}
}

方法二

【题目解析】 考察位运算
【解题思路】 根据位运算,获取每一位的二进制值。获取第i位的值:(n>>i)& 1.如果1连续,则计数累加,如果不连续,则从0开始计数

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
	int n;
	while (cin >> n)
	{
		int count = 0; 
		int maxCount = 0;
		// n向右移动32次就变为0
		while (n)
		{
			if (n & 1) //获取当前的二进制位
			{
				//如果1的值连续, 计数累加,并且更新最大计数
				++count;
				maxCount = max(count, maxCount);
			}
			else
			{
				count = 0; //如果不连续, 计数置0,重新累加
			}
			n = n >> 1; //向右移一次, 为获取下一个二进制做准备
		}
		cout << maxCount << endl;
	}
	system("pause");
}
发布了55 篇原创文章 · 获赞 12 · 访问量 5262

猜你喜欢

转载自blog.csdn.net/weixin_43939593/article/details/103326914