Código fuente del diseño del algoritmo de Python: https://github.com/MakerChen66/Python3Algorithm
Declaración de derechos de autor: la originalidad no es fácil, este artículo prohíbe el plagio, la reimpresión y la infracción debe investigarse.
Tabla de contenido
1. Adición binaria | máquina de estados finitos
La suma de números binarios se puede hacer como se enseña en la escuela, solo recuerda 1 + 1 = 10 y sigue ciertas reglas. Hay mucho que decir sobre esta aritmética aparentemente simple, por ejemplo, puede ver la implementación de un sumador paralelo, hay muchas cosas interesantes en él.
Decidí usar una implementación en serie a través de una máquina de estados finitos, con 4 estados basados en combinaciones de salida 0/1 y acarreo 0/1 y grupos de transiciones basados en bits de entrada.
La pregunta es ¿realmente necesitas cuatro estados? De hecho, solo se pueden usar tres estados, ¿qué puedes encontrar?
Implementación del algoritmo de Python:
import itertools
p0c0 = 0, {
}
p1c0 = 1, {
}
p0c1 = 0, {
}
p1c1 = 1, {
}
# 各进程状态之间的转换
p0c0[1].update({
(0, 0): p0c0, (1, 0): p1c0,
(0, 1): p1c0, (1, 1): p0c1})
p1c0[1].update({
(0, 0): p0c0, (1, 0): p1c0,
(0, 1): p1c0, (1, 1): p0c1})
p0c1[1].update({
(0, 0): p1c0, (1, 0): p0c1,
(0, 1): p0c1, (1, 1): p1c1})
p1c1[1].update({
(0, 0): p1c0, (1, 0): p0c1,
(0, 1): p0c1, (1, 1): p1c1})
def add(x, y):
x = map(int, reversed(x))
y = map(int, reversed(y))
z = []
# 模拟自动机
value, transition = p0c0
for r, s in itertools.zip_longest(x, y, fillvalue=0):
value, transition = transition[r, s]
z.append(value)
z.append(transition[0, 0][0])
return ''.join(map(str, reversed(z)))
print(add('1100100100100', '100100011000'))
Aviso:
- itertools
es el módulo iterador de python, que proporciona funciones muy útiles para manipular objetos iterativos, como la función zip_longest() Las herramientas proporcionadas por itertools son bastante eficientes y ahorran memoria. Con estas herramientas, podrá crear sus propios iteradores personalizados para un bucle eficiente. - zip_longest(it_obj1, …, it_objN,
fillvalue=None), las funciones implementadas por su función son más o menos las mismas que la función zip integrada (realiza una correspondencia uno a uno), pero la función zip integrada se basa en el objeto con la menor cantidad de elementos, mientras que la función zip_longest se basa en el elemento La mayoría de los objetos se utilizan como punto de referencia, y los lugares vacíos se llenan con el valor de fillvalue - map(function,iterable,…) mapeará la secuencia especificada de acuerdo con la función proporcionada. La primera función de parámetro
llama a la función de función con cada elemento en la secuencia de parámetros y devuelve una nueva lista que contiene el valor de retorno de cada función de función. - La suma binaria comienza desde el extremo derecho, por lo que el número binario de entrada debe invertirse con la función invertida () y luego invertirse después de la operación
Resultado de salida:
como se muestra en la figura, el resultado de la operación de suma binaria es 10001000111100, el resultado es correcto
2. Descarga del código fuente
Descarga del código fuente del diseño del algoritmo de Python:
- Enlace de descarga de GitHub: Portal
- Enlace al texto original: Leer el texto original
3. Información del autor
Autor: Xiaohong's Fishing Daily, Objetivo: ¡Hacer la programación más interesante!
Cuenta pública original de WeChat: " Tecnología Xiaohong Xingkong ", centrada en el reclutamiento escolar (introducción/bijing/cara a cara), algoritmo, rastreador, sitio web, desarrollo de juegos, análisis de datos, procesamiento de lenguaje natural, IA, etc., esperando a su atención, ¡crezcamos y codifiquemos juntos!
Nota de derechos de autor: ¡Este artículo prohíbe el plagio y la reimpresión, y la infracción debe investigarse!