题解 | #整数与IP地址间的转换#
整数与IP地址间的转换
https://www.nowcoder.com/practice/66ca0e28f90c42a196afd78cc9c496ea
/*
解题思路:十进制与二进制的互相转换,注意:十进制数转二进制数之后要补足8位再拼接
*/
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <cmath>
using namespace std;
string DecimaltoBinary(long long x){
string res = "";
while(x){
int temp = x % 2;
res = to_string(temp) + res;
x >>= 1;
}
if(res.size() < 8){
string tmp = res;
int n = 8 - res.size();
res = "";
while(n--){
res += '0';
}
res += tmp;
}
return res;
}
long long BinarytoDecimal(string x){
int len = x.size();
long long res = 0;
int i = 0;
while(len--){
int bit = x[i++] - '0';
res += bit * pow(2, len);
}
return res;
}
long long IPtoDecimal(string input){
istringstream iss(input);
vector<int> v;
string seg;
while(getline(iss, seg, '.')){
v.push_back(stoi(seg));
}
string tmp = "";
for(int val : v){
tmp += DecimaltoBinary(val);
}
long long ans = BinarytoDecimal(tmp);
return ans;
}
string DecimaltoIP(long long input){
string ans = "";
string tmp = DecimaltoBinary(input);
int len = tmp.size();
int n = 32 - len;
string temp = tmp;
tmp = "";
while(n--){
tmp += '0';
}
tmp += temp;
vector<string> v;
string s = "";
for(int i = 0; i < tmp.size(); i++){
s += tmp[i];
if(s.size() % 8 == 0){
v.push_back(s);
s = "";
}
}
for(string x : v){
long long c = BinarytoDecimal(x);
ans += to_string(c);
ans += '.';
}
ans.pop_back();
return ans;
}
int main() {
string inputs;
cin >> inputs;
long long inputn;
cin >> inputn;
long long ans1 = IPtoDecimal(inputs);
string ans2 = DecimaltoIP(inputn);
cout << ans1 << endl << ans2 << endl;
return 0;
}
