前言 说真的我人傻了
看过这个系列前一部的人可能会知道我采用了字符串的形式去表示一串二进制代码,并且对二级制的操作完全局限在字符串的层面,不论是二进制加法还是减法都要自己去定义函数才能做到。
但是今天,我仔细研究别人的代码后,我人傻了。
如何科学操作二进制
遵循下面几条原则:
- 二进制串和十进制数字 一一对应
- 对二进制有效的运算(异或,或,与),可以直接用10进制数字转换为2进制串,然后运算
所以,问题解决了,用10进制数字存储2进制串,然后用python自带的二进制算法去处理,下面给出几个例子
'''例子1 : 直观的构造二进制数字'''
#比如我需要 x=100100
#数一数串中的1在第几位,然后作为2的指数,并相加
x=2**(6-1)+2**(3-1) #x=36
#然后利用上一个文章我们提到的转换函数测试一下是否正确
print(bin(x))# 输出 0b100100 前面的0b是二进制的前缀,所以我们的算法完全正确
'''例子2 : 给2进制赋予含义'''
#一般来说使用二进制都是与布尔型相对应 比如一串布尔序列(one-hot) 或是汉明码 以及一些特殊的序列串
#这个例子中赋予二进制 一串密码 的意义,希望比较两串密码的重合程度
code_1=2**15+2**13+2**11+2**1 # 0b1010100000000010
code_2=2**15+2**12+2**10+2**1 # 0b1001010000000010
#非常直观的看到密码串有4个地方没有匹配上,所以如何快速输出结果4呢
#大家也都明白,for循环是非常低效的,尤其是多个for循环嵌套,简直是复杂度杀手,所以提升运算速度的秘诀就在这里了
#进行一次异或运算,异或运算就是二进制串的相同位置,相同则输出0,不相同则输出1
unmatch=code_1^code_2 #十进制15360二进制0b11110000000000
#接下来只要输出不相同的个数,也就是unmatch中1的个数就可以了
#python有个很方便的函数
print(bin(unmatch).count('1'))#输出 4 也就是有4处不匹配,相当完美
所以问题解决,有不清楚的地方留言,一起讨论一起进步