Autor Tema: cadena de bits

0 Usuarios y 1 Visitante están viendo este tema.

14 Diciembre, 2010, 07:20 pm
Leído 5123 veces

super_eman

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 372
  • Karma: +0/-0
  • Sexo: Masculino
  • Solo se que no se nada
    • Matemática una pasión
¡¡¡Hola!!!
Aunque no tengo mucho éxito con mis cuestiones de programación sigo intentando...
Rindo este viernes y tengo muchas dudas, espero que me ayuden o me sugieran un foro donde respondan este clase de preguntas.
Supongamos  que  queremos  imprimir todas las cadenas de bits (arreglos de 0 y 1) de longitud n .
Resolver este problema  sin usar recursión, usando que las cadenas de bits de longitud n pueden pensarse como los coeficientes en base 2 de los números entre 0 y \( 2^{n-1} \). Sugerencia: para k = 0, . . . , \( 2^{n-1} \), construir la lista de coeficientes en base 2 e imprimirla.

¡¡Muchas Gracias!!

15 Diciembre, 2010, 12:46 am
Respuesta #1

Phicar

  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 513
  • Karma: +1/-0
  • Sexo: Masculino
    • redinfocol.org
Sin usar recursion me imagino que puedes usar iteracion..:P iteras en enteros desde 0 a \( 2^n-1 \) inclusive.
y conviertes :P...(es mas lo que dices se hace convirtiendo)

O la otra que se me ocurre es con Gray Codes..hay una forma de generarlos basandose en una especie de reflexion.

para cualquiera de las dos tienes que hacer padding con ceros por la izquierda.
redinfocol.org

15 Diciembre, 2010, 03:47 am
Respuesta #2

super_eman

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 372
  • Karma: +0/-0
  • Sexo: Masculino
  • Solo se que no se nada
    • Matemática una pasión
Hola Phicar!!!
Gracias por la respuesta, pero me olvide decir que es en lenguaje pascal...que es el padding o Gray codes? es pascal.
Saludos

15 Diciembre, 2010, 04:32 am
Respuesta #3

Phicar

  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 513
  • Karma: +1/-0
  • Sexo: Masculino
    • redinfocol.org
yo de pascal no tengo la menor idea..pero pos los algoritmos son algoritmos.

Padding es simplemente llenar de algo una cadena..

lo que te digo es porque pos digamos 1 en binario es 1...pero necesitas cadenas de 4 bits..

tonces haces padding por la izquierda, con ceros, y te queda 0001

-------

Gray Codes es una codificacion que se invento un segnor de apellido Gray xDDD que se parece a la binaria pero la cuestion reside en que entre dos codigos que sean consecutivos solo varia un bit.

El caso es que los gray codes pueden ser generados de la siguiente manera

en el principio tendras el 0 y 1.. despues duplicas el vector donde los almacenas y reflemas.

me refiero

tienes 0,1 al duplicar el vector y reflejar quedaria

0,1,1,0

despues coges la primera parte y haces padding con 0, y la segunda haces padding con 1.

queda

00,01,11,10

y te quedan los del dos..haces lo mismo hasta que llegues a la longitud n. :)
redinfocol.org

15 Diciembre, 2010, 05:38 am
Respuesta #4

cheroky

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 143
  • País: 00
  • Karma: +0/-0
  • Sexo: Masculino
  • Un globo, dos globos, tres globos...
Hola.

Para resolver este tipo de problemas, ademas del algoritmo, algo que no tiene que ver con el lenguaje, si influye los mecanismos de operación sobre objetos que aporta el mismo.

En este caso con operación sobre objetos me refiero a los operadores bitwise que lo hacen a nivel de bit. Basta con incrementar una variable de tipo entero desde \( 0 \) hasta \( 2^{n-1} \) y en cada iteración leer los bits de la variable mediante un bucle e imprimir.

Esta método aunque es de complejidad cuadrática, es el más sencillo. En lenguaje C llevaría pocos minutos implementarlo, en pascal no creo que difiera mucho.   


Un saludo.
\( \color{black} \overrightarrow{\mathbb{C} h\exists \mathbb{R} \varnothing k Y} \)

15 Diciembre, 2010, 07:01 am
Respuesta #5

super_eman

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 372
  • Karma: +0/-0
  • Sexo: Masculino
  • Solo se que no se nada
    • Matemática una pasión
Hola Cheroky, eso es lo que necesito que me ayudes a pasar los números a bit, mediante ese bucle... eso es lo que no me sale. Muy amables en responder Cheroky and Phicar!!!

15 Diciembre, 2010, 09:34 am
Respuesta #6

cheroky

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 143
  • País: 00
  • Karma: +0/-0
  • Sexo: Masculino
  • Un globo, dos globos, tres globos...
Hola.

Busca en google por operadores bitwise y base binaria en pascal, algún ejemplo encontrarás. Te puedo poner un ejemplo en C pero igual no te aclara demasiado.

#include<stdio.h>

#define N 20  /* un numero */

int main(void)
{
int n_bits = sizeof n_bits * 8 -1; /* Tamaño en bits (int) */
int i, k;

    for(i = 0; i < N; i++)
    {
        for(k = n_bits; k >= 0; k--)
        {
            printf("%d", !! (i & 0x1 << k) ); /* Desplazamiento dado por k a la iz de 1 y and sobre i */
           
            if(k % 8 == 0) putchar(' ');
        }
    putchar('\n');
    }

    return 0;
}


Un saludo.
\( \color{black} \overrightarrow{\mathbb{C} h\exists \mathbb{R} \varnothing k Y} \)