PDA

Ver la versión completa : Ayuda con este Algoritmo men..



Don Balon
06/04/2010, 21:21
Buenas people..

Tengo que hacer un Algoritmo en C que realice el pasaje de un número decimal a binario sin utilizar la división / . O sea tengo que usar los Operadores de bits.

Leí por ahí que >> y << se usan para multiplicar y dividir respectivamente.

Pero por ejemplo, no se si en el algoritmo puedo poner directamente:

15 >>

Bajo nivel creo que se hace esto:
15 = 1111
1111 >> = 0111 = 7


Ponele que sea así, si divido a 15 por 2( o sea corro un digito con >>) :
15 >> = 0111

El resultado es 7 pero como obtengo que el resto fue "1" para poder almacenarlo y así poder ir formando el pasaje.



Necesito que me orienten, no me escriban el algoritmo hecho, porque no me sirve de nada. Gracias.

Besos..

Nighthawk
06/04/2010, 23:16
Buenas people..
Tengo que hacer un Algoritmo en C que realice el pasaje de un número decimal a binario sin utilizar la división / . O sea tengo que usar los Operadores de bits.




15 >> 1 = 0111

0111 = 7

15-7 = 8

8 = 1000

15 >> 2 = 0011

0011 = 3

15 - 8 = 7 0111
7 - 3 = 4 0100

8 = 1000
4 = 0100

15 >> 3 = 0001
0001 = 1

15 - 8 = 7 0111
7 - 4 = 3 0011
3 - 1 = 2 0010

8 = 1000
4 = 0100
2 = 0010

15 >> 4 = 0000

15 - 8 = 7 0111
7 - 4 = 3 0011
3 - 2 = 1 0001
1 - 0 = 1 0001

8 = 1000 +
4 = 0100 +
2 = 0010 +
1 = 0001
--------------
15 = 1111

....


se ve la idea?
el resto de 15/2, a nivel de bit, no es "1", es "8": 1000
con "15" no te vas a dar cuenta a simple vista.... cuanto mas grande sea el numero mejor, mas bits para usar.

(algoritmo recursivo? 0.o)

rinoa
06/04/2010, 23:50
Lei la mitad de lo que pusiste, mejor edito ajajaja
En el codigo lo tenes que usar aclarando la "cantidad de lugares que queres correr ese bit", por ejemplo:

aux = num>>1;

Edit:
Algo que podrias hacer para no perder el numero es primero armar una mascara al bit menos significativo y despues hacer el desplazamiento.

Nighthawk
07/04/2010, 00:09
igual serviria, porke

40 = 00101000 = 32 + 8
80 = 01010000 = 64 + 16

70 = 01000110 = 64 + 4 + 2
35 = 00100011 = 32 + 2 + 1

5 >> 2 seria ((5 / 2) / 2) = 1
0101
0010
0001

y esta bien. 5/4 = 1

Don Balon
07/04/2010, 17:58
Perfecto Nighthawk, entonces voy corriedo lugares aumentado +1. Los resultado que me va dando los voy restando al número anterior consecutivamente así hasta que la suma de todos los resultados den el número 15 en ese ejemplo. Pero faltaría devolver ese número representado en binario :/ ¿Me explico?



8 = 1000 +
4 = 0100 +
2 = 0010 +
1 = 0001
--------------
15 = 1111



Saludos.

EPP
09/04/2010, 01:22
Dividi haciendo restas sucesivas...

A - B = RESULTADO

Restas hasta que A < B y vas preguntando por el resultado...

A lo guacho seria...



MIENTRAS A > B HACER

A = A - B
IF A = PAR

ARRAY[i] = 0

ELSE A = IMPAR
ARRAY[i] = 1
END IF
i++
FIN MIENTRAS
ARRAY[i] = A
MOSTRAR EL CONTENIDO DEL ARREGLO


No se si entendi bien pero eso no usa división...

Para saber si es par o impar podes usar MOD creo... ya me olvide como se programaba en C xD

Don Balon
09/04/2010, 17:31
EPP tengo que usar si o si operadores de Bits, gracias igual :p

El MOD en C es %

EPP
11/04/2010, 16:02
EPP tengo que usar si o si operadores de Bits, gracias igual :p

El MOD en C es %

Ok me perdi esa parte o no la lei jajaja

Hoy cero ganas pero despues si veo que no solucionaste trato de colaborar :P