/* 关键在于2的31次方应该用long来表示 */ #include<iostream> #include<string> #include<vector> #include<algorithm> #include<math.h> using namespace std; int convert10(vector<int>& data,int s,int e) { int base = pow(2,7); int ans = 0; for(int i=s;i<=e;i++) { if(data[i]) { ans+=base; } base/=2; } return ans; } // 十进制转成2进制 void convert2(string& data,vector<int>& res) { int num = stoi(data); // 开始转换 // 十进制开始转换二进制 int base = pow(2,7); int index = 0; while(num>0 && index<8) { if(num>=base) { res[index]=1; num-=base; } index++; base/=2; } } void ip2num(string& ip) { auto iter = find(ip.begin(), ip.end(), '.'); vector<int> ip_1(8); string data1(ip.begin(),iter); // cout<<"data1: "<<data1<<endl; convert2(data1, ip_1); auto iter2 = find(++iter, ip.end(), '.'); vector<int> ip_2(8); string data2(iter,iter2); // cout<<"data2: "<<data2<<endl; convert2(data2, ip_2); auto iter3 = find(++iter2, ip.end(), '.'); vector<int> ip_3(8); string data3(iter2,iter3); // cout<<"data3: "<<data3<<endl; convert2(data3, ip_3); vector<int> ip_4(8); string data4(++iter3,ip.end()); // cout<<"data4: "<<data4<<endl; convert2(data4, ip_4); long base = pow(2,31); long res =0; for(int i=0;i<8;i++) { if(ip_1[i]) { res+=base; } base/=2; } for(int i=0;i<8;i++) { if(ip_2[i]) { res+=base; } base/=2; } for(int i=0;i<8;i++) { if(ip_3[i]) { res+=base; } base/=2; } for(int i=0;i<8;i++) { if(ip_4[i]) { res+=base; } base/=2; } cout<<res<<endl; } void num2ip(long num) { vector<int> vec(32,0); long base =pow(2,31); int index = 0; while(num>0 && index<=31) { // cout<<num<<" "<<base<<" "<<index<<endl; if(num>=base) { vec[index]=1; num-=base; } index++; base/=2; } index =0; int sum = 0; cout<<convert10(vec, 0, 7)<<"."; cout<<convert10(vec, 8, 15)<<"."; cout<<convert10(vec, 16, 23)<<"."; cout<<convert10(vec, 24, 31)<<endl; } // int ip2num(string& ip) { // } int main() { string ip; long num; while(cin>>ip) { cin>>num; // cout<<"ip: "<<ip<<endl; ip2num(ip); num2ip(num); } }