题目
注意点:
- 大小最接近的两个数,一个略大,一个略小
- num 不能为负:第32位不能是 1
解题
书上解释的很详细,注意看 return -1 的判断条件。
解题一:位运算
// javascript
var getNext = function(num) {
let n = num, c0 = 0, c1 = 0;
while (((n & 1) === 0) && (n !== 0)) {
c0++;
n >>>= 1;
}
while ((n & 1) === 1) {
c1++;
n >>>= 1;
}
// c0 + c1 = 31,第32位由0翻转成1,为负数,不符合要求
// c1 = 0,需要有1翻转成0,没有1无法完成操作
if (c0 + c1 === 31 || c1 === 0) {
return -1;
}
let p = c0 + c1;
num |= 1 << p;
num &= (~0)