Given a non-negative integer `num`

, return the number of steps to reduce it to zero. If the current number is even, you have to divide it by 2, otherwise, you have to subtract 1 from it.

**Example 1:**

Input:num = 14Output:6Explanation:Step 1) 14 is even; divide by 2 and obtain 7. Step 2) 7 is odd; subtract 1 and obtain 6. Step 3) 6 is even; divide by 2 and obtain 3. Step 4) 3 is odd; subtract 1 and obtain 2. Step 5) 2 is even; divide by 2 and obtain 1. Step 6) 1 is odd; subtract 1 and obtain 0.

**Example 2:**

Input:num = 8Output:4Explanation:Step 1) 8 is even; divide by 2 and obtain 4. Step 2) 4 is even; divide by 2 and obtain 2. Step 3) 2 is even; divide by 2 and obtain 1. Step 4) 1 is odd; subtract 1 and obtain 0.

**Example 3:**

Input:num = 123Output:12

**Constraints:**

`0 <= num <= 10^6`

```
struct Solution;
impl Solution {
fn number_of_steps(mut num: i32) -> i32 {
let mut res = 0;
while num != 0 {
if num & 1 == 1 {
num -= 1;
} else {
num >>= 1;
}
res += 1;
}
res
}
}
#[test]
fn test() {
let num = 14;
let res = 6;
assert_eq!(Solution::number_of_steps(num), res);
let num = 8;
let res = 4;
assert_eq!(Solution::number_of_steps(num), res);
let num = 123;
let res = 12;
assert_eq!(Solution::number_of_steps(num), res);
}
```