Non-negative Integers without Consecutive Ones

hard dp bit manipulation

Problem

Count integers in [0, n] whose binary representation has no two adjacent 1s.

Inputn = 5
Output5
Valid: 0,1,2,4,5 (skipping 3 = 11₂).

def find_integers(n):
    fib = [1, 2]
    for _ in range(30): fib.append(fib[-1] + fib[-2])
    ans, prev = 0, 0
    for i in range(30, -1, -1):
        if n & (1 << i):
            ans += fib[i]
            if prev: return ans
            prev = 1
        else: prev = 0
    return ans + 1
function findIntegers(n) {
  const fib = [1, 2]; while (fib.length < 32) fib.push(fib[fib.length-1] + fib[fib.length-2]);
  let ans = 0, prev = 0;
  for (let i = 30; i >= 0; i--) {
    if (n & (1 << i)) {
      ans += fib[i];
      if (prev) return ans;
      prev = 1;
    } else prev = 0;
  }
  return ans + 1;
}
int findIntegers(int n) {
    int[] fib = new int[32]; fib[0] = 1; fib[1] = 2;
    for (int i = 2; i < 32; i++) fib[i] = fib[i-1] + fib[i-2];
    int ans = 0, prev = 0;
    for (int i = 30; i >= 0; i--) {
        if ((n & (1 << i)) != 0) {
            ans += fib[i];
            if (prev == 1) return ans;
            prev = 1;
        } else prev = 0;
    }
    return ans + 1;
}
int findIntegers(int n) {
    vector fib(32); fib[0] = 1; fib[1] = 2;
    for (int i = 2; i < 32; i++) fib[i] = fib[i-1] + fib[i-2];
    int ans = 0, prev = 0;
    for (int i = 30; i >= 0; i--) {
        if (n & (1 << i)) {
            ans += fib[i];
            if (prev) return ans;
            prev = 1;
        } else prev = 0;
    }
    return ans + 1;
}
Time: O(log n) Space: O(log n)