整数与IP地址间的转换

来源:互联网 发布:淘宝充话费联通 编辑:程序博客网 时间:2024/05/18 13:24

题目描述

原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。
举例:一个ip地址为10.0.3.193
每段数字             相对应的二进制数
10                   00001010
0                    00000000
3                    00000011
193                  11000001
组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。

 

的每段可以看成是一个0-255的整数,需要对IP地址进行校验

 

 

 


输入描述:

输入 1 输入IP地址2 输入10进制型的IP地址



输出描述:

输出1 输出转换成10进制的IP地址2 输出转换后的IP地址


输入例子:
10.0.3.193167969729

输出例子:
16777312110.3.3.193

思路:(1)将IP转换为对应10进制数字;设置一个量为1,与对应位相与判断该位置是否为1,如果为1,将该位对应值累加,一直到移位判断32次;

(2)将10进制数转换为IP地址;同样采用移位每移位8次,算出介于0~255的数放到vector容器中,一共存4个数,最后再反向输出,注意加“.”

代码如下(还要保证 long long 型)

#include<iostream>#include<string>#include<vector>using namespace std;long long power(int i)//用于计算2的多次幂{long long s = 1;for (int j = 0; j < i; j++)s *= 2;return s;}void tr(long long num)//将10进制数转换为IP地址输出{vector<int>  v;int sum, time = 0;int in = 1;while (time <4){sum = 0;for (int i = 0; i < 8; i++){if (num&in){sum += power(i);}in = in << 1;}v.push_back(sum);time++;}for (int i = v.size() - 1; i >= 0; i--)if (i == 0)cout << v[i] << endl;else cout << v[i] << '.';}long long trl(int a,int b,int c,int d)//将IP地址转换为10进制数输出{long long num = 0;long  in = 1;for (int i=0; i < 8; i++){if (d&in)num += power(i);in = in << 1;}in = 1;for (int i=0; i < 8; i++){if (c&in)num += power(i+8);in = in << 1; }in = 1;for (int i=0; i < 8; i++){if (b&in)num += power(i+16);in = in << 1;}in = 1;for (int i=0; i < 8; i++){if (a&in)num += power(i+24);in = in << 1;}return num;}int main(){int a, b, c, d;//用于记录IP地址的各位char s;long long num;//记录10进制地址while (cin>>a>>s>>b>>s>>c>>s>>d){cin >> num;cout <<trl(a, b, c, d) << endl;tr(num);}return 0;}



0 0
原创粉丝点击