# 与函数代码【直接从前面搬】 def AND(a, b): s1 = '' for i in range(len(a)): if a[i] == '1' and b[i] == '1': s1 = s1 + '1' else: s1 = s1 + '0' return s1 # 非函数代码【还是从前面搬的】 def NOT(a): s3 = '' for i in range(len(a)): if a[i] == '1': s3 = s3 + '0' else: s3 = s3 + '1' return s3 # 二进制换十进制代码【还是从前面搬的,甚至是能转换小数的高级版本!】 # 因为我实在是弄不清楚python内置二进制换十进制是什么要求了...(欢迎评论告诉我!) def BinToDec(x): s = 0 if '.' not in x: for i in range(len(x)): if x[i] == '1': s = s + 2**(len(x)-i-1) return s elif '.' in x: if float(x) > 1: a = x.index('.') for i in range(a): if x[i] == '1': s += 2**(a-i-1) for j in range(a+1, len(x)): if x[j] == '1': s += 2**((-1)*(j-a)) elif float(x) < 1: for i in range(2, len(x)): if x[i] == '1': s += 2**((-1)*(i-1)) return s # 使用了python内置的进制转换函数bin,顺便把分段的二进制数位用0补齐 # 这里的一个易错点是:二进制和十进制都是八位一组(不足八位补齐),不是一个整体数字 def turn(L): s = [] for i in range(len(L)): ai = bin(int(L[i])) bi = ai.replace('0b', '') s.append(bi) s1 = [] for j in range(len(s)): if len(s[j]) < 8: k = '0'*(8-len(s[j])) + s[j] s1.append(k) elif len(s[j]) == 8: k = s[j] s1.append(k) return s1 # 关于这个函数要实现的功能: # 把一个列表里的二进制字符串改为十进制 # 其实完全可以跟前面的封装到一起 def turn_(L): s = [] for i in range(len(L)): ai = BinToDec(L[i]) s.append(ai) return s def parseIP(ip, mask): IP = ip.split('.') MASK = mask.split('.') # 这是两个把输入分好段的列表 ip1 = turn(IP) mask1 = turn(MASK) # ip1和mask1是两个二进制分段的列表 c_bin = [] d_bin = [] for i in range(len(ip1)): ci = AND(ip1[i], mask1[i]) di = AND(ip1[i], NOT(mask1[i])) c_bin.append(ci) d_bin.append(di) # 这是两个运算后的二进制列表 c_ans = turn_(c_bin) d_ans = turn_(d_bin) # 终于搞到答案了!以下是最终的输出步骤。 c = '' d = '' for i in range(len(c_ans)-1): c = c + str(c_ans[i]) + '.' d = d + str(d_ans[i]) + '.' # 《关于不让for循环在最后点点这件事》 for i in range(len(c_ans)-1, len(c_ans)): c = c + str(c_ans[i]) d = d + str(d_ans[i]) return c
代码行数有点多,可能比较繁杂。希望大家在评论区里多分享自己的观点,一起学习,共同进步!悄悄白嫖地不要!