算法小知识-----04.01-----交替位二进制数

221 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

更文活动的开始也意味着,可以驱动自己去进一步拓展或者学习(尽管是外物驱动)

交替位二进制数

该题出自力扣的693题 —— 交替位二进制数【简单题】

审题

给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。

输入: n = 5
输出: true
解释: 5 的二进制表示是:101
  • 根据题意可得出,给定一个整数,判断其二进制是否为1/0的交替出现。

  • 由于简单的题意,所以题解也相对容易浮现:

    • 把给定的整数从十进制转换成二进制
    • 再遍历每一位二进制数,确认是否重合或者交替出现
    • 遍历过程中,出现不符合即可返回False
  • 根据上述思路,可总结两套题解:

    • 题解一:
      • 遍历整数,;利用 & 1,取出最后一位二进制数
      • 取出二进数与cur变量 异或(^),如果结果为0,则代表与上一位相同,返回False
      • 变量 cur = 当前二进制数,整数右移一位
    • 解题二:
      • 利用更为巧妙的交替位二进制,如果当前二进制的交替位不为相同数的话,只需要取与其对应相反的数,按位与运算后(&)必定 = 0
      • 010101 右移一位得到 001010
         二者异或之后得到011111  (这一步是关键,只有交替出现01,异或后才能得到结果0111111...11)
         为了判断 异或后的结果是否满足(0111111...11)类型的结果
         可以用如下方法,比如
         011111 加上1100000
         011111100000按位相与 结果为000000 , 也就是0;
        
        

    编码

    • 解法一:
        public boolean hasAlternatingBits(int n) {
         int cur = -1;
         while (n != 0) {
             int u = n & 1;
             if ((cur ^ u) == 0) return false;
             cur = u; n >>= 1;
         }
         return true;
     }
    
    • 解法二:
        public boolean hasAlternatingBits(int n) {
         int t = n ^(n  >> 1);
         return (t & (t+1)) == 0;
     }
    

image.png