Python用字符串做二进制乘法和Python调用内置进制转换我踩的坑

注意本文加法的思想来源于 https://blog.csdn.net/qiubingcsdn/article/details/82263114
其余为我自己做的

  • 字符串str的末位是实际上计算的首位,所以第一步是翻转字符串

首先弄清楚python的字符串列表有2种取值顺序:
从左到右索引默认0开始的

s = 'ilovepython'

s[0]的结果是i

然后从右到左索引默认-1开始的

s = 'ilovepython'

s[-1]的结果是n

str=‘1000’
应该从末尾的0开始计算,为了方便首先翻转。Python可以巧妙用元组的特性。

a = a[::-1]
  • 乘法可以看作每层相与之后的加法,调用加法的时候注意理清楚逻辑

    首先倒序的目的只是为了逻辑上的最低位为str[0],只存在于函数的计算过程中,这样算出来的结果也是与我们直接看到的相反。因此判断是否要把这个字符串倒序只需要分为:
    需要这个字符串来直接进行加减计算的/字符串直接相加而成的→倒序
    这个字符串作为函数的参数/调用函数的结果→正序

  • 注意变量的位置到底在哪层循环里面,局部变量容易被误清零

    还有一个问题,for中的range也是一个数列,数字数列。
    因此for i in range(1,5)相当于 for i in [1, 2, 3, 4]
    for i in range(5)也相当于 for i in [1, 2, 3, 4]


    一些细节上的小问题。建议遇到问题先谷歌翻译试图自行理解,比直接搜CSDN要快得多。

  • int()不能使用显式base转换非字符串
    int() can’t convert non-string with explicit base

  • b_sum = int(b[index])
    ValueError: invalid literal for int() with base 10: 'b'
    

    int()的基数为10的文字无效:
    invalid literal for int() with base 10:
    意思是这里的b[index]中的index出现了十进制无法识别的东西

    int("12345",2)
    

    报的也是这个错误,因为这里的意思是,把【二进制数】12345强行转换成十进制,但是2345显然不是二进制数,所以这里是错误的。

  • 输入的类型不能被强制转换为整型,比如输入了一个浮点型
    oct() takes exactly one argument

  • str对象不能直接强制爱转换成整数
    ‘str’ object cannot be interpreted as an integer

  • 字符串不可直接下标更改值,只有列表可以。
    TypeError: ‘str’ object doesn’t support item deletio


我遇到的错误前情 :
八进制和十六进制只输入11110000之类的0和1是没问题的。但是出现了别的数字就不行。

出现问题的原因:
oct(x)
hex(x)
里面的参数x是十进制数字
但是函数的返回值是带有 “0o” "0x"的字符串
使用前需要先转换成十进制数字!

int(a, 8) 是说明a是一个八进制数,需要被转换成十进制!这个时候,为了区分十进制和八进制,a必须要有前缀"0o"
千万不要偷懒觉得八进制不会像十六进制一样出现无法识别的ABC就直接输入了。
比如:

>>a = input("请输入第一个八进制数: ")
10
>>p = beBin(int(a))

因为输入八进制的10,实际上a=9,但是直接输入的时候,a=10
后面计算全部出错!

源代码

def addBinary(a, b):
    if len(a) < len(b):  # 以长的二进制字符串为遍历起点
        temp = a
        a = b
        b = temp
    a = a[::-1]  # 倒序二进制字符串
    b = b[::-1]
    extra = 0  # 进位
    new_binary = ""
    for index, num in enumerate(a):  # 遍历
        if index > len(b) - 1:  # 判断短的二进制字符串是否越界
            b_sum = 0
        else:
            b_sum = int(b[index])
        new_binary = new_binary + str((int(num) + b_sum + extra) % 2)  # 二进制加法运算
        if int(num) + b_sum + extra > 1:  # 是否进位
            extra = 1
        else:
            extra = 0
    if extra == 1:  # 最高位是否进位
        new_binary = new_binary + "1"
    return new_binary[::-1]  # 倒序输出


def MulBinary(a, b):
    if len(a) < len(b):  # 以长的二进制字符串为遍历起点
        temp = a
        a = b
        b = temp
    a = a[::-1]  # 倒序二进制字符串
    b = b[::-1]
    Add = ""
    index = 0

    for num in b:  # 遍历
        new_binary = ""
        flag = 0
        for x in a:
            for i in range(index):
                if flag == 0:
                    new_binary = new_binary + "0"
                    flag = 1
            new_binary = new_binary + str((int(num) & int(x)))

        index = index + 1
        new_binary = new_binary[::-1]

        if index == 1:
            Add = new_binary
        else:
            Add = addBinary(Add, new_binary)  # 二进制加法运算

    return Add  # 倒序输出


def SudBinary(a, b):
    if len(a) < len(b):  # 以长的二进制字符串为遍历起点
        temp = a
        a = b
        b = temp
    a = a[::-1]  # 倒序二进制字符串
    b = b[::-1]
    extra = 0  # 退位
    new_binary = ""
    for index, num in enumerate(a):  # 遍历
        if index > len(b) - 1:  # 判断短的二进制字符串是否越界
            b_sum = 0
        else:
            b_sum = int(b[index])
        new_binary = new_binary + str((int(num) - b_sum - extra) % 2)  # 二进制减法运算
        if int(num) - b_sum - extra < 0:  # 是否退位
            extra = 1
        else:
            extra = 0

    if new_binary[-1] == 0:
        del new_binary[-1]

    return new_binary[::-1]  # 倒序输出


def beBin(a):
    # print(a)
    p = bin(a)
    # print(p)
    p = p.replace("0b", '')
    return p


def AddOct(a, b):

    p = beBin(int(a, 8))
    q = beBin(int(b, 8))
    t = oct(int(addBinary(p, q), 2))
    return t


def AddHex(a, b):

    p = beBin(int(a, 16))
    q = beBin(int(b, 16))
    t = hex(int(addBinary(p, q), 2))
    return t


def MulOct(a, b):

    p = beBin(int(a, 8))
    q = beBin(int(b, 8))
    t = oct(int(MulBinary(p, q), 2))
    return t


def MulHex(a, b):

    p = beBin(int(a, 16))
    q = beBin(int(b, 16))
    t = hex(int(MulBinary(p, q), 2))
    return t


def SudOct(a, b):

    p = beBin(int(a, 8))
    q = beBin(int(b, 8))
    t = oct(int(SudBinary(p, q), 2))
    return t


def SudHex(a, b):

    p = beBin(int(a, 16))
    q = beBin(int(b, 16))
    t = hex(int(SudBinary(p, q), 2))
    return t


a =input("请输入第一个二进制数: ")
b =input("请输入第二个二进制数: ")
print("a+b= "+addBinary(a, b))
print("a*b="+MulBinary(a, b))
print("a-b= "+SudBinary(a, b))

a = '0o'+input("请输入第一个八进制数: ")
b = '0o'+input("请输入第二个八进制数: ")
print("输出是八进制的:")
print("a+b= "+AddOct(a, b))
print("a*b="+MulOct(a, b))
print("a-b= "+SudOct(a, b))

a = '0x'+input("请输入第一个十六进制数: ")
b = '0x'+input("请输入第二个十六进制数: ")
print("输出是十六进制的:")
print("a+b= "+AddHex(a, b))
print("a*b="+MulHex(a, b))
print("a-b= "+SudHex(a, b))

猜你喜欢

转载自blog.csdn.net/qq_41337100/article/details/85638053
今日推荐