1、思路
-
在遍历
num
每一位时,追踪当前1序列的长度和上一段1序列的长度; -
当遇到比特位为0时,分两种情况讨论:
1、若下一个比特位为1,那么preLen = curLen
;
2、若下一个比特位为0,那么preLen = 0
,我们不能合并这两个1序列。
2、代码
class Solution {
public:
int reverseBits(int num) {
if (~num == 0) return 32; //全是1的情况,若不特判会输出33
int curLen = 0, preLen = 0;
int maxLen = 1; //最少也能翻转1位
for (int i = 0; i < 32; ++ i)
{
if ((num & 1) == 1)
{
curLen ++ ;
}
else
{
preLen = ((num & 2) == 0) ? 0 : curLen; //判断下一比特位是否为0
curLen = 0;
}
maxLen = max(maxLen, preLen + curLen + 1);
num >>= 1;
}
return maxLen;
}
};