IPv4地址转换成整数_100分_A/B复用卷_位运算/字符串

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
tu

代码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));
}

相关位运算题目:

出错的或电路_200分_前缀和/位运算_A/B复用卷
分苹果_100分_A/B卷复用_位运算/异或运算

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值