/**
* @param {number} n
* @return {number}
*/
var minOperations = function(n) {
let ans = 0;
let cnt = 0;
while(n != 0) {
if (n & 1 == 1) {
// 发现 1 不做操作,只计数
cnt++;
} else {
// 发现 0 看当前 1 的计数
if (cnt == 1) {
// 如果 1 的计数为 1,说明刚刚过去单个1,直接减掉就行
cnt = 0;
ans++;
} else if (cnt > 1) {
// 如果 1 的计数大于 1,说明刚刚过去多个1,需要进到当前位置上来
cnt = 1;
ans++;
}
}
n >>= 1;
}
if (cnt >= 2) {
// 最后如果剩下的计数大于2,说明高位还有一些 1,直接两次操作带走
return ans + 2;
}
// 否则高位还有最后一个 1,一步带走
return ans + 1;
};