利用位运算解决| #整数与IP地址间的转换#
整数与IP地址间的转换
https://www.nowcoder.com/practice/66ca0e28f90c42a196afd78cc9c496ea
import java.util.Scanner; import java.util.ArrayList; import java.util.List; import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { private static long ip2Int(String s) { String[] strArr = s.split("\\."); List<Long> list = new ArrayList<>(strArr.length); for (int i = 0; i < strArr.length; i++) { //要用long类型,否则会溢出 long num = Long.parseLong(strArr[i]); //分别左移24位,16位,8位,0位 num = num << 8 * (3 - i); //全部放到list数组中,下面要遍历出来合并成完整的二进制数 list.add(num); } long ans = 0; for (int i = 0; i < list.size(); i++) { //用异或算法合并整个二进制数 ans ^= list.get(i); } //返回合并后的数即可 return ans; } private static String Int2Ip(String s) { //要用long类型,否则会溢出 long t = Long.parseLong(s); List<Long> list = new ArrayList<>(4); for (int i = 0; i < 4; i++) { //分别左移0位,8位,16位,24位,并且与255进行与运算,获取到最后8位二进制数 list.add((t >> 8 * i) & 255); } //打印出来IP地址 StringBuilder sb = new StringBuilder(); for (int i = list.size() - 1; i >= 0; i--) { sb.append(list.get(i)); sb.append("."); } return sb.substring(0, sb.length() - 1); } public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 while (in.hasNext()) { // 注意 while 处理多个 case String s = in.next(); if (s.contains(".")) { System.out.println(ip2Int(s)); } else { System.out.println(Int2Ip(s)); } } } }