[C con Clase] Hola a todos - Ayuda con operaciones con binarios

Steven Davidson steven en conclase.net
Dom Mar 18 18:13:59 CET 2007


Hola David,

El pasado 2007-03-18 08:12:32, David Gonzalez escribió:

DG> Hello Steven,

[CORTE]

DG> La idea del ejercicio que me plantean ess basicamente esto.
DG> 3. Pedir un numero al usuario.
DG> 2. Usando modulo (%) y algo que no tengo aun muy claro, validar que el
DG> usuario haya escrito 1s y 0s, sin mostrar mensaje de error

Como dije en el mensaje anterior, no puedes validar el valor introducido por el usuario para determinar si es o no es binario, pero sí su representación. Esto implica que tendrás que manejar la cadena de caracteres que el usuario escribe desde el teclado. Para esto, tendrás que leer los caracteres en una cadena. En C++, esto es simplemente,

char szNumero[128]="";

cin >> szNumero;

Ya hora nos toca validar la cadena para determinar si representa un número binario o no. Para esto, simplemente comprueba cada carácter. El algoritmo sería algo así:

booleano EsBinario( cadena C, número N )
1.  Para: i <- 1 hasta N
2.     Si C[i] != '1' ó C[i] != '0', entonces
3.        Terminar( falso )
4.  Terminar( verdadero )

Si no tienes que ser explícito, entonces usa la función estándar 'strtol()' que además de comprobar, te hace la conversión, si se puede.

DG> 3. SI lo anterior es binario hacer las operaciones +, -, * y / con
DG> esos numeros.

Esto ya no estoy muy seguro de lo que tienes que hacer. ¿Tienes que implementar las operaciones aritméticas como si los valores fuesen binarios? Dicho de otro modo, ¿tienes que simular las operaciones aritméticas tomando cada bit de ambosa valores? Si no tienes que simular nada, entonces usa los operadores de C/C++.

DG> 4. Mostrar el resultado en binario.

Bueno, esto ya se trata de acceder cada bit para determinar su valor y así poder mostrar un '0' o un '1'. Para tal acceso, usa máscaras con una operación AND. Por ejemplo,

Si tenemos un valor representado como 10110100, entonces para averiguar el primer bit, usamos la máscara 10000000. Ahora aplicamos la operación AND:

    10110100
AND 10000000
------------
    10000000

Como no es igual a 0 (cero), entonces es un 1.

Ahora miramos el siguiente bit, usando la máscara 01000000. La operación es:

    10110100
AND 01000000
------------
    00000000

Como es igual a 0, entonces el bit vale 0.

Y así sucesivamente, hasta terminar; esto es, hasta que nuestra máscara AND sea 0.

El algoritmo viene a ser el siguiente:
Mostrar( número N )
1.  Máscara <- 1 SHL 8  // Esto es equivalente a: Máscara <- 256
2.  Mientras que Máscara > 0, repetir:
3.     Si N AND Máscara = 0, entonces
4.        Mostrar( '0' )
5.     Si no, entonces
6.        Mostrar( '1' )
7.     Máscara <- Máscara SHR 1  // Esto es equivalente a: Máscara / 2
8.  Terminar.

Lo de SHL y SHR se refieren a las operaciones de desplazamiento a nivel de bit. En inglés, SHL es "SHift Left" o "Desplazamiento a la izquierda" y SHR se refiere a "SHift Right" o "Desplazamiento a la derecha". Estas operaciones implican una multiplicación por 2 y una división entre 2, respectivamente. Bajo C/C++, empleamos los operadores << y >>, respectivamente.

[CORTE]

DG> Claro que me despeja muchas dudas en mi cabeza, por eso si fuera
DG> posible que me dierasn seudocodigo y alguna luz para crear las
DG> funciones sera super.
DG> Miles de gracias intentaré usar el concepto pero aún sigo como
DG> perdido.

Espero que con esto, vamos aclarando las cosas.

Steven


Más información sobre la lista de distribución Cconclase