一起养成写作习惯!这是我参与「掘金日新计划 · 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 加上1 为100000 011111 与 100000按位相与 结果为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; } - 题解一: