868. 二进制间距

给定一个正整数 N,找到并返回 N 的二进制表示中两个连续的 1 之间的最长距离。
如果没有两个连续的 1,返回 0 。
 
 

示例 1:
输入:22
输出:2
解释:
22 的二进制是 0b10110 。
在 22 的二进制表示中,有三个 1,组成两对连续的 1 。
第一对连续的 1 中,两个 1 之间的距离为 2 。
第二对连续的 1 中,两个 1 之间的距离为 1 。
答案取两个距离之中最大的,也就是 2 。

示例 2:
输入:5
输出:2
解释:
5 的二进制是 0b101 。

示例 3:
输入:6
输出:1
解释:
6 的二进制是 0b110 。

示例 4:
输入:8
输出:0
解释:
8 的二进制是 0b1000 。
在 8 的二进制表示中没有连续的 1,所以返回 0 。

 
提示:

 1 <= N <= 10^9
 
思路:一遍遍历,用一个 max 表示遍历过程中的最大距离,运用位运算从右向左检查低位,如果 (N & 1) != 0 就说明低位是1,则更新distance距离为0,把当前作为第一个一,同时更新当前max,话不多说 看代码。
 1 int binaryGap(int N) 
 2 {
 3     int distance = 0, max = 0, distanceon = 0;
 4 
 5     while(N > 0)
 6     {
 7         if((N & 1) != 0) //如果碰到1就更新distance的值 碰到0就直接加一
 8         {
 9             distanceon = 1;
10             if(distance > max)
11             {
12                 max = distance;
13             }
14             distance = 0;
15         }
16         distance += distanceon;
17         N = N >> 1; 
18     }
19     return max;
20 }

按位与运算符 ‘&’,是对比二进制数的每一位数,如果是1则结果为1,否则都为0;

例如:00011011

           00001001

结果:00001001 

 
原文地址:https://www.cnblogs.com/ZhengLijie/p/12850371.html