【Educoder作业】不择手段星人的解析IP地址【问题求解-进制-第8关】

# 与函数代码【直接从前面搬】
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

代码行数有点多,可能比较繁杂。希望大家在评论区里多分享自己的观点,一起学习,共同进步!悄悄白嫖地不要!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值