#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;
}