欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

判断子网掩码是否合法-Java

程序员文章站 2024-03-17 11:47:28
...
import java.util.*;

/**
 * 判断子网掩码是否合法
 */
public class Main1801 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        System.out.println(isTrue(s));
    }
    public static boolean isTrue(String s) {
        String[] split = s.split("\\.");
        ArrayList<ArrayList<Integer>> list = new ArrayList<>();//创建泛型为数组的数组,数组里的每个数组存储分割后的一组数(总共4组)
        for (String value : split) {
            int num = Integer.parseInt(value);
            ArrayList<Integer> list1 = new ArrayList<>();//新建数组存储二进制数
            while (num != 0) {
                list1.add(num % 2);//注意 这里存储的二进制数是倒序的
                num = num / 2;
            }
            if (list1.size()!=8){//判断转换成的二进制数是否满足8位,若不满足,则在后面追加相应数量的0
                int n = list1.size();
                for (int i = 0; i < 8-n; i++) {
                    list1.add(0);
                }
            }
            Collections.reverse(list1);//处理好的二进制数组,进行倒序处理,才是正确的要存到大数组中的一组数(总共4组)
            System.out.println(list1.toString());
            list.add(list1);
        }
        StringBuilder builder = new StringBuilder();
        for (ArrayList<Integer> integers : list) {
            for (Integer integer : integers) {
                builder.append(integer);
            }
        }
        String toString = builder.toString();
        if (toString.equals("11111111111111111111111111111111")||toString.equals("00000000000000000000000000000000")){ //全1或者全0的子网掩码也是不合法的
            return false;
        }
        for (int i = 0; i < toString.length()-1; i++) {
            String substring = toString.substring(i, i + 2);
            if (substring.equals("01")){//如何判断子网掩码是否合法,在最后拼接好的32位二进制字符串中查找,是否包含“01”,若包含则不合法
                return false;
            }
        }
        return true;
    }
}