Asuntos Oficiales > Retos
Bitwise Operations
The Black Boy:
haaa.... si esta muy facil... ;)
Gracias por la aclaracion Juank
Nagisa:
Si, realmente es muy facil. Yo ya lo tengo, lo que ocurre es que los datos que dan como prueba no producen la salida esperada. La cuestion es que el tamaño de un entero varia segun platraforma y compilador.
En mi ordenador con el gcc es de 32 bits, por lo que para producir un overflow necesitamos un numero del orden de 4.2E9 (algo mas).
Aqui posteo mi solucion, la cual considero bastante "elegante" (no habia hecho un codigo recursivo tan bonito desde mi primer factorial... snif)
(Adjunto como .txt por que como .c no me deja)
The Black Boy:
te felicito Nagisa... :good:
Amilius:
:blink:
ahi va uno no recursivo en ASM:
--- Código: Text --- const BitSuperior=$80000000; function SumaDesbordada(a,b:dword):longbool;// var bit_A,bit_B:dword; begin{ result:=true; repeat if ((a or B) and bitSuperior)=0 then break;//no if ((a and B) and bitSuperior)<>0 then exit;//si a:=a shl 1;//siguiente bit superior b:=b shl 1; until (a or B)=0; result:=false;}{ repeat bit_A:=a and BitSuperior; bit_B:=b and BitSuperior; a:=a shl 1; b:=b shl 1; until bit_A=bit_B; result:=(bit_A<>0);} asm //a está en eax //b está en edx //Bitsuperior=esi //bit_A=ecx //bit_B=ebx push ebx// preservar! push esi// preservar! mov esi,BitSuperior @ciclo: mov ecx,eax and ecx,esi mov ebx,edx and ebx,esi shl eax,1 shl edx,1 xor ebx,ecx//cmp hace una resta :P jnz @ciclo pop esi pop ebx mov result,ecx//prácticamente igual a mov eax,ecx end; end;
:blink:
Ya veo el problema:
Esto no funciona (el flag de overflow, ni el de carry) para a y b como enteros de 32bits SIN signo:
--- Código: Text --- //Sólo para a y b enteros 32bits con signo asm //a está en eax //b está en edx xor ecx,ecx//ecx=false add eax,edx//sumar jno @fin//saltar si no existe overflow not ecx//ecx=true @fin: mov result,ecx end;
Noel Solw:
Naqisa : la solucion recursiva que enviastes es realmente sumamente elegante, y sobre todo muy simple.
Sinceramente, te felicito ! ! ! - Noel
Navegación
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa