题目描述
功能: 求一个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");
}