#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
#include <functional>

using namespace std;

//1000位,所以又要用字符串来实现 
//这次不定义类了,直接写个字符串除法函数 

string Div(const string &s, int x){//提高要求,实现一个除以x的函数 
	//仍旧“模拟竖式”
	string ans;
	int last = 0;
	for(int i=0; i<s.size(); i++){
		int tmp=s[i]-'0';
		if((tmp+last)/x || ((tmp+last)/x==0 && !ans.empty()) || s.size()==1){
			ans.push_back((tmp+last)/x+'0');
		}
		last = (tmp+last) % x * 10;
	}
	return ans;
}

string Mul(const string &s, int x){//实现十进制乘法 依旧模拟竖式 
	string ans;
	int last = 0;
	for(int i=s.size()-1; i>=0; i--){
		int tmp = last + (s[i]-'0')*x;
		ans.push_back(tmp%10+'0');
		last = tmp/10;
	}
	if(last){
		ans.push_back(last+'0');
	}
	reverse(ans.begin(),ans.end());
	return ans;
}

string Add(const string &s, int x){//最后实现个加法,应该就没问题了 
	string ans;
	int last = 0;
	int ttmp = s[s.size()-1]-'0'+x;
	last = ttmp/10;
	ans.push_back(ttmp%10+'0');
	for(int i=s.size()-2; i>=0; i--){//偷懒一点 只实现加个位数 
		int tmp = last +(s[i]-'0');
		last = tmp/10;
		ans.push_back(tmp%10+'0');
	}
	reverse(ans.begin(),ans.end());
	return ans;
}

string Convert_eg63(string x){
	string s;
	string ans = "0";
	if(x=="0"){
		s.push_back('0');
	}else{
		while(x!="0"){
			s.push_back(x[x.size()-1]%2+'0');
			x = Div(x, 2);
		}
	}
	//此时s就是逆置的。
	for(int i=0; i<s.size(); i++){
		ans = Mul(ans, 2);
		ans = Add(ans, s[i]-'0');
	}
	return ans;
}

int main(){
	string x;
	while(cin >> x){
		printf("%s\n",Convert_eg63(x).c_str());
	}
	return 0;
}