题解 | #整数与IP地址间的转换#
整数与IP地址间的转换
http://www.nowcoder.com/practice/66ca0e28f90c42a196afd78cc9c496ea
思路确实不难,转之前先转为二进制,但是这中间转换的小细节又多又恶心。。。
#include <bits/stdc++.h>
using namespace std;
// ipstr --> unsigned
unsigned int str2uint (string ipstr) {
for (char &c : ipstr) {
if (c == '.') c = ' ';
}
stringstream ss(ipstr);
vector<string> vs;
string tmp;
while (ss >> tmp)
{
vs.push_back(tmp);
}
// 需要对数组中的每一个数字字符串转为8位的二进制
string ipstr_bin;
for (string tmp : vs) {
int inttmp = 0; // int变量一定要记得初始化为0啊
for (int i = 0; i < tmp.size(); i++) {
inttmp = inttmp * 10 + (tmp[i] - '0');
}
bitset<8> bs(inttmp);
ipstr_bin += bs.to_string();
}
unsigned int res = 0;
for (int i = 0; i < 32; i++) {
if (ipstr_bin[i] == '1')
res += pow(2, 31 - i);
}
return res;
}
string uint2str (unsigned int uintip) {
// 函数实现将int类型的ip转化为四段式的ip字符串
// 应先转为二进制,然后再将二进制分段式的转为0-255的数
bitset<32> bs(uintip);
// 要特别注意bs的0是从最低为开始的
string res;
string ipstr_bin = bs.to_string();
vector<int> vec; // 存储4个字段
for (int i = 0; i < 32; i += 8) {
bitset<8> bs(ipstr_bin.substr(i, i+8));
vec.push_back((int)bs.to_ulong());
}
for (int tmp : vec) {
res += to_string(tmp);
res += '.';
}
res.pop_back();
return res;
}
int main() {
// 函数实现将ip字符串转为整形,将整形转为ip字符串
// 10.0.3.193
// 167969729
// 167773121
// 10.3.3.193
string ipstr;
unsigned int ipuint;
string ipbin;
while (cin >> ipstr >> ipuint) {
cout << str2uint(ipstr) << endl;
cout << uint2str(ipuint) << endl;
}
return 0;
}
查看14道真题和解析

海康威视公司福利 1125人发布