题目
给你一个非负整数 num
,请你返回将它变成 0 所需要的步数。 如果当前数字是偶数,你需要把它除以 2 ;否则,减去 1 。
解题思路
直接模拟可以写,但科班人不能满足于此,位运算解决之。末尾为 1
的时候是奇数,需要对原数 -1
,操作数 +1
,又因为 /2
是必须的操作,所以答案就是二进制位数加上二进制中 1
的个数再 -1
(首位不算)。
代码
class Solution {
public int numberOfSteps(int num) {
int ans = 0;
while (num > 0) {
if ((num & 1) == 1) ans++;
ans++;
num = num >> 1;
}
return ans == 0 ? ans : ans - 1;
}
}