再贴一遍,真的很难受。。。

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
    unsigned long long n;
    cin >> n;
    if (n == 0)
    {
        cout << 1 << endl;
        return 0;
    }
    else if (n == 1 || n == 2)
    {
        cout << 2 << endl;
        return 0;
    }
    else if (n == 3)
    {
        cout << 3 << endl;
        return 0;
    }
    string binaryForm;
    bool flag = false;
    for (unsigned long long i = (long long)1 << 63; i != 0; i = i >> 1)
    {
        if (i & n)
        {
            binaryForm += '1';
            flag = true;
        }
        else
        {
            if (flag)
            {
                binaryForm += '0';
            }
        }
    }

    int length = binaryForm.size();
    long long count = 1;
    int curr = 1;
    for (int i = 0; i < length - 1; i++)
    {
        if (i % 2 == 0 && i != 0)
        {
            curr *= 2;
        }
        count += curr;
    }

    string subLeft = binaryForm.substr(1, (length - 1) / 2);
    int times = 1;
    for (int i = subLeft.size() - 1; i >= 0; i--)
    {
        if (subLeft[i] == '1')
        {
            count += times;
        }
        times *= 2;
    }
    string newBinaryForm = "1" + subLeft;
    if (length % 2)
    {
        subLeft.pop_back();
    }
    reverse(subLeft.begin(), subLeft.end());
    newBinaryForm += subLeft + "1";
    if (newBinaryForm <= binaryForm)
    {
        count++;
    }

    cout << count << endl;

    return 0;
}