Este es un seguimiento de my question yesterday:bit a bit de sustracción en Python
CMS proporcionado amablemente este ejemplo del uso de los operadores bit a bit para sumar dos números en C:
#include<stdio.h>
int add(int x, int y) {
int a, b;
do {
a = x & y;
b = x^y;
x = a << 1;
y = b;
} while (a);
return b;
}
int main(void){
printf("6 + 3 = %d", add(6,3));
printf("6 - 3 = %d", add(6,-3));
return 0;
}
Funciona muy bien y luego portado a Python de la siguiente manera:
def add(x, y):
while True:
a = x & y
b = x^y
x = a << 1
y = b
if a == 0:
break
return b
print "6 + 3 = %d" % add(6,3)
print "6 - 3 = %d" % add(6,-3)
Ambos trabajan para la suma y el programa C también funciona para la resta. Sin embargo, el programa Python ingresa un bucle infinito para la resta. Estoy tratando de llegar al fondo de esto y he publicado el programa aquí para una mayor experimentación: http://codepad.org/pb8IuLnY
¿Alguien puede decir por qué habría una diferencia entre la forma en que C maneja esto y la forma en que CPython maneja esto?
Gracias por la información. ¿Esto significa que no es posible la resta a bit? Todo lo que he leído en línea sugiere convertirlo en un problema de suma bit a bit tomando el complemento de dos del segundo operando. – user23126
Creo que necesitaría cambiar el comportamiento del operador de desplazamiento a la izquierda, vea mi respuesta editada. –
El desplazamiento a la izquierda se define en términos de multiplicación en Python (http://docs.python.org/reference/expressions.html#shifting-operations), por lo que creo que deberá buscar otro enfoque si quiere que esto funcione con números negativos. . –