IPv4地址转换成整数
题目描述:
存在一种虚拟IPv4地址,由4小节组成,每节的范围为0~128,以#号间隔,格式如下:
(1 ~ 128)#(0 ~ 255)#(0 ~ 255)#(0 ~ 255)
请利用这个特性把虚拟IPv4地址转换为一个32位的整数,IPv4地址以字符串形式给出,要求每个IPvV4地址只能对应到唯一的整数上。
如果是非法IPv4,返回invalid IP。
输入输出描述:
输入描述:
输入一行,虚拟IPv4地址格式字符串
输出描述:
输出一行,按照要求输出整型或者特定字符
示例1:
输入:
100#101#1#5
输出:
1684340997
示例2:
输入:
1#2#3
输出:
invalid IP
解题思路:
解题思路1:位运算:
1、首先判断IP地址是否合法,合法的格式是:(1 ~ 128)#(0 ~ 255)#(0 ~ 255)#(0 ~ 255)
2、对于IPV4中的每一段,将之先变成十进制表示的数,然后再转换成二进制(转换过程中,由于都是正整数,所以可以直接使用算术左移)
代码1:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String[] split = scanner.nextLine().split("#");
if (split.length != 4) {
System.out.println("invalid IP");
return;
}
long res = 0;
for (int i = 0; i < 4; i++) {
char[] chars = split[i].toCharArray();
long digit = 0;
// 把每一段内的数字变成十进制表示
for (int j = 0; j < chars.length; j++) {
// 数字是否合法
if (chars[j] < '0' || chars[j] > '9') {
System.out.println("invalid IP");
return;
}
digit = digit * 10 + (chars[j] - '0');
}
// 数字段是否合法
if ((i == 0 && (digit < 0 || digit > 128)) || (i != 0 && (digit < 0 || digit > 255))) {
System.out.println("invalid IP");
return;
}
// 位运算方式,要进行左移
res += digit << (8 * (3 - i));
}
System.out.println(res);
}
解题思路2:调用函数进行转换:
1、首先判断IP地址是否合法,合法的格式是:(1 ~ 128)#(0 ~ 255)#(0 ~ 255)#(0 ~ 255)
2、对于IPV4中的每一段,将之先变成十进制表示的数,然后:
①使用Integer.toBinaryString(int i)先将十进制数转成二进制01序列表示
②将01序列转成十进制数字(直接转,数字中也只包含01)
③将②得到的01数字格式化成8位的字符串即可(String.format(“%08d”, bin2int))
详细说明可已查看API说明
http://www.51gjie.com/java/1070.html
代码1:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String[] split = scanner.nextLine().split("#");
if (split.length != 4) {
System.out.println("invalid IP");
return;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 4; i++) {
char[] chars = split[i].toCharArray();
int digit = 0;
for (int j = 0; j < chars.length; j++) {
// 数字是否合法
if (chars[j] < '0' || chars[j] > '9') {
System.out.println("invalid IP");
return;
}
digit = digit * 10 + (chars[j] - '0');
}
// 数字段是否合法
if ((i == 0 && (digit < 0 || digit > 128)) || (i != 0 && (digit < 0 || digit > 255))) {
System.out.println("invalid IP");
return;
}
// 十进制转成二进制,二进制填充成 8 位
String int2bin = Integer.toBinaryString(digit);
int bin2int = Integer.parseInt(int2bin);
String format8bit = String.format("%08d", bin2int);
sb.append(format8bit);
}
System.out.println(Integer.parseInt(sb.toString(), 2));
}