【java华为机试】HJ33 整数与IP地址间的转换

描述

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

组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。

数据范围:保证输入的是合法的 IP 序列

输入描述:

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

输出描述:

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

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			String s = sc.nextLine();
			// 如果此字符串包含 ".",则返回 true,否则返回 false
			if (s.contains(".")) {
				System.out.println(ip2num(s));
			} else {
				System.out.println(num2ip(Long.parseLong(s)));
			}
		}
	}

	public static long ip2num(String ip) {
		String[] arrayIp = ip.split("\.");
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < 4; i++) {
			// 用十进制参数表示的整数值。
			int num = Integer.parseInt(arrayIp[i]); // 拆分
			// 用二进制(基数 2)参数表示的无符号整数值的字符串表示形式。
			String num2 = Integer.toBinaryString(num); // 转换为二进制
			while (num2.length() < 8) {
				num2 = "0" + num2; // 拼接
			}
			// 将指定的字符串追加到此字符序列。
			sb.append(num2);
		}
		return Long.parseLong(sb.toString(), 2); // 转化为10进制
	}

	public static String num2ip(long num) {
		String num2 = Long.toBinaryString(num); // 转换为2进制
		while (num2.length() < 32) {
			num2 = "0" + num2;
		}
		String[] ans = new String[4];
		for (int i = 0; i < 4; i++) {
			String s = num2.substring(8 * i, 8 * i + 8); // 拆分
			s = Integer.toString(Integer.parseInt(s, 2)); // 转化为10进制
			ans[i] = s;
		}
		return String.join(".", ans); // 拼接
	}
}
输入: 10.0.3.193 167969729
输出: 167773121 10.3.3.193
经验分享 程序员 微信小程序 职场和发展