Asuntos Oficiales > Retos

 Bitwise Operations

<< < (2/5) > >>

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=&#036;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)&#60;&#62;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&#60;&#62;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

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa