def bitone(n): cnt = 0 m = n while m > 0: if m % 2 == 1: cnt += 1 m = m / 2 return cnt def maketree(i, n, memo): left = [] right = [] p = i + bitone(i) m = i - bitone(i) nmemo = memo if p <= n and not(p in memo): nmemo.append(p) if m >= 1 and not(m in memo): nmemo.append(m) if p in nmemo: left = maketree(p, n, nmemo) if m in nmemo: right = maketree(m, n, nmemo) return [i, left, right] def bfs(tree, n): lst = [tree] search = [tree] cnt = 1 while lst != []: nsearch = [] for i in range(0, len(search)): node = lst.pop(0) if node[0] == n: return cnt if node[1] != []: nsearch.append(node[1]) lst.append(node[1]) if node[2] != []: nsearch.append(node[2]) lst.append(node[2]) search = nsearch cnt += 1 return -1 n = int(raw_input()) tree = maketree(1, n, [1]) print bfs(tree, n)