题目来源于力扣(LeetCode)
目录
一、题目
题目相关标签:位运算
二、解题思路
2.1 位运算——逐位比较
-
记录下数值二进制位的最低位
-
循环获取数值二进制位的最低位,判断当前获取的最低位,是否与之前记录的最低位相同
-
相同时,返回 false,说明非交替位
-
不同时,更新最低位的变量为当前最低位,继续判断
2.2 位运算——规律方式
判断某数的二进制位是否是交替的
-
异或操作:
int a = n ^ (n >>> 1)
-
按位与操作:
a & (a + 1) == 0
-
若某数的二进制位是交替的,则结果一定为 0,不为 0 时说明二进制位非交替位
三、代码实现
3.1 位运算——逐位比较
public static boolean hasAlternatingBits(int n) {
// 取得 n 二进制位的最低位
int tailBit = n & 1;
// 取一位少一位
n = n >> 1;
while (n != 0) {
// 与记录的最低位值相同时说明不是交替的
if ((n & 1) == tailBit) {
return false;
} else {
// 0 与 1 的转换
tailBit = tailBit ^ 1;
}
n >>= 1;
}
return true;
}
3.2 位运算——规律方式
public static boolean hasAlternatingBits(int n) {
// 异或操作 + 右移位 101 ^ 010 = 111
int a = n ^ (n >>> 1);
// 按位与判断结果是否为 0,111 与 1000
return (a & (a + 1)) == 0;
}
四、执行用时
4.1 位运算——逐位比较
4.2 位运算——规律方式
五、部分测试用例
public static void main(String[] args) {
int num = 5; // output: True
// int num = 7; // output: False
// int num = 11; // output: False
// int num = 10; // output: True
boolean result = hasAlternatingBits(num);
System.out.println(result);
}