Problem:
Problem B: OOllOll

Problem

非負整数$x$を2進数表記したときの各桁の和を$f(x)$とする。

正整数$N$が与えられるので$f(0)$,$f(1)$,...,$f(N)$の中で最大のものを出力せよ。

関数$f(5)$の計算の例:

5を2進数表記すると101で各桁の和は1+0+1=2

よって$f(5) = 2$となる。

Note: https://ja.wikipedia.org/wiki/二進法

Input

入力は以下の形式で与えられる。

$N$

正整数$N$が1行に与えられる。

Constraints

入力は以下の条件を満たす。

$1 \le N \le 10^9$

Ouput

$f(0)$,$f(1)$,...,$f(N)$の中で最大のものを1行に出力する。

Sample Input 1

2

Sample Output 1

1

Sample Input 2

9

Sample Output 2

3

Solution in C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Globalization;
using System.Diagnostics;
using Pair = System.Collections.Generic.KeyValuePair<int, int>;

class Program
{
    static void Main()
    {
        Console.SetOut(new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false });
        new Program().Solve();
        Console.Out.Flush();
    }
    Scanner cin = new Scanner();


    void Solve()
    {
        long N = cin.Nextlong;
        long a = 1;
        int ans = 0;
        while (a * 2 <= N + 1)
        {
            a *= 2;
            ans++;
        }
        
        Console.WriteLine(ans);
    }

}

class Scanner
{
    string[] s; int i;
    char[] cs = new char[] { ' ' };
    public Scanner() { s = new string[0]; i = 0; }
    public string[] Scan { get { return Console.ReadLine().Split(); } }
    public int[] Scanint { get { return Array.ConvertAll(Scan, int.Parse); } }
    public long[] Scanlong { get { return Array.ConvertAll(Scan, long.Parse); } }
    public double[] Scandouble { get { return Array.ConvertAll(Scan, double.Parse); } }
    public string Next
    {
        get
        {
            if (i < s.Length) return s[i++];
            string st = Console.ReadLine();
            while (st == "") st = Console.ReadLine();
            s = st.Split(cs, StringSplitOptions.RemoveEmptyEntries);
            i = 0;
            return Next;
        }
    }
    public int Nextint { get { return int.Parse(Next); } }
    public long Nextlong { get { return long.Parse(Next); } }
    public double Nextdouble { get { return double.Parse(Next); } }
}