ls = readlines raise unless ls.size == 1 n = ls[0] raise unless n == "0\n" || n =~ /^[1-9][0-9]*$/ def f n n + 1 - (1 << n.to_i.to_s(2).count('1')) end p f n.to_i