整数与ip地址间的转换

整数与ip地址间的转换

题目

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

思路

录入整数,进制转换,求值

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include<stdio.h>
#pragma warning(disable : 4996)

int bir(int ip[32], int i,int flag); //将ip地址转化为2进制的函数
int longbir(int ip[32], long unsigned i); //将长整数转化为2进制
int unbir(int* ip ,int cp); //二进制分段转化为整数
long unsigned int ips(int ip[32]); //二进制转化为长整数
int main(void)
{
int a, b, c, d;
long unsigned cp;
int ip[32] = { 0 };
int dp[32];
while (scanf("%d.%d.%d.%d", &a, &b, &c, &d)!=EOF)
{
scanf("%lu", &cp);
bir(ip, a, 1); // 第一段转化为二进制
bir(ip, b, 2); //第二段
bir(ip, c, 3); //第三段
bir(ip, d, 4); //第四段转化为二进制
printf("%lu\n", ips(ip)); //转化为长整数
longbir(dp, cp); /
printf("%d.%d.%d.%d\n", unbir(dp, 1), unbir(dp, 2), unbir(dp, 3), unbir(dp, 4));

}
return 0;

}
int bir(int ip[32], int i, int flag)
{
static j = 7;
int r,k;
r = (i % 2);
switch (flag) //分段选择
{
case 1:k = j; break;
case 2:k = j+8; break;
case 3:k = j+16; break;
case 4:k = j+24; break;
}
ip[k] = r;
j--;
if (i >= 2)
bir(ip, i / 2, flag);
if ((i / 2) == 0)
{
while (j-- >= 0)
ip[--k] = 0;
j = 7;
return 0;
}
}
long unsigned int ips(int ip[32])
{
static o = 31;
int i;
long unsigned num=0,temp;
for (i = 0,temp=1; i<32; o--,i++) //循环将二进制转化为长整数
{
num += (ip[o] * temp);
temp *= 2;

}
o = 31;
return num;

}
int longbir(int ip[32], long unsigned i) //长整数转为二进制
{
static j = 31;
int r;
r = (i % 2);
ip[j] = r;
j--;
if (i >= 2)
longbir(ip, i / 2);
if ((i / 2) == 0)
{
while (j >= 0)
{
ip[j] = 0;
j--;
}
j = 31;
return 0;
}
}
int unbir(int* ip, int cp) //二进制分段转化为整数
{
static j = 7;
int i, k;
switch (cp)
{
case 1:k = j; break;
case 2:k = j + 8; break;
case 3:k = j + 16; break;
case 4:k = j + 24; break;
}

int num = 0, temp;
for (i = 0, temp = 1; i < 8; k--, i++)
{
num += (ip[k] * temp);
temp *= 2;

}
j =7;
return num;
}

反思

重点是进制转换,两次进制转换就可以求出所需结果。

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2020 lsengard
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信