题解 | #整数与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; }