2012-01-20 13 views
6

¿Podría alguien echar un vistazo a este código descuidado y explicarme por qué no funciona? ¿Estoy empacando y desempacando cosas correctamente? (El objetivo de esta práctica de laboratorio era empaquetar una fecha utilizando el cambio de bits y el enmascaramiento. Por ejemplo, la entrada de la consola del 31/12/99 se sincronizaría en OR y luego se anularía, que es lo que mi código intentaba hacer. Gracias .Las máscaras de cambio de bits todavía me eluden

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 


#define DAY_MASK 0x3e0 
#define MONTH_MASK 0xc00 
#define YEAR_MASK (~0x3180) 

void hr() 
{ 
    printf("-----------------------------------------------\n"); 
} 

void fields() 
{ 
    printf("  Binary\t\tDTG\t\tBase 10\n"); 
} 

void prnFields(unsigned int *day, unsigned int *month, unsigned int *year) 
{ 
    printBits(day); 
    printf("\tDay\t\t%u\n", day); 
    printBits(month); 
    printf("\tMonth\t\t%u\n", month); 
    printBits(year); 
    printf("\tYear\t\t%u\n", year); 
} 

int main() 
{ 
    unsigned int day; 
    unsigned int month; 
    unsigned int year; 
    unsigned int packed; 

    printf("Enter numeric Day\t:"); 
    scanf("%d", &day); 
    printf("Enter numeric Month\t:"); 
    scanf("%d", &month); 
    printf("Enter two digit Year\t:"); 
    scanf("%d", &year); 
    printf("\n"); 

    hr(); 
    printf("\nPrepacked Date\n"); 
    fields(); 
    hr(); 
    prnFields(day, month, year); 
    hr(); 

    packed = day; packed <<= 9; 
    packed |= month; packed <<= 4; 
    packed |= year; 
    printf("\nPacked Date\n"); 
    fields(); 
    hr(); 
    printBits(packed);printf("\t\t\t%d\n", packed); 
    hr(); 
    printf("\nUnpacked Date\n"); 
    fields(); 
    hr(); 
    printBits((packed & DAY_MASK)); 
    printf("\tDay\t\t%d \n", (packed & DAY_MASK) >> 9); 
    printBits((packed & MONTH_MASK)); 
    printf("\tMonth\t\t%d \n", (packed & MONTH_MASK) >> 5); 
    printBits((packed & YEAR_MASK)); 
    printf("\tYear\t\t%d \n", (packed & YEAR_MASK)); 
    //system("pause"); 
    return(0); 
} 

void printBits(unsigned short int value) 
{ 
    unsigned short int mask =1; 
    int i; 
    mask<<=15; 

    for(i=1; i<=16; i++) 
    { 
     putchar((mask&value)? '1': '0'); 

     if(i%8==0) 
     { 
      putchar(' '); 
     } 

     value<<=1; 
    } 
} 
+0

¿De qué manera no funciona? –

+0

cuando se ejecuta, si ingreso una fecha de 31,12,99 debería obtener los mismos resultados en el lado de salida, pero no es así. Probablemente debido a un mal cambio y/o enmascaramiento, que es donde creo que necesito más ayuda. – David

+0

¿Cómo consigues que el año encaje en cuatro bits? –

Respuesta

3

usted parece tener muy pocos bits asignados para el mes (0xc00) y la forma de hacerlo no es fácil de ver si sus cambios son correctos.

me gustaría sugerir a definir sus constantes de una manera más consistente como esta:

#define DAY_BITS 5 
#define MONTH_BITS 4 
#define YEAR_BITS 7 

#define DAY_OFFSET YEAR_BITS 
#define MONTH_OFFSET (YEAR_BITS + DAY_BITS) 
#define YEAR_OFFSET 0 

#define DAY_MASK ~(~0 << DAY_BITS ) 
#define MONTH_MASK ~(~0 << MONTH_BITS) 
#define YEAR_MASK ~(~0 << YEAR_BITS ) 

... ahora puede establecer el valor empaquetado de esta manera:

packed = 0; 
packed |= (day & DAY_MASK ) << DAY_OFFSET; 
packed |= (month & MONTH_MASK) << MONTH_OFFSET; 
packed |= (year & YEAR_MASK ) << YEAR_OFFSET; 

... y conseguir los campos individuales como este:

printf("\tDay\t\t%d \n", (packed >> DAY_OFFSET ) & DAY_MASK); 
printf("\tMonth\t\t%d \n", (packed >> MONTH_OFFSET) & MONTH_MASK); 
printf("\tYear\t\t%d \n", (packed >> YEAR_OFFSET ) & YEAR_MASK); 

Ahora puede simplemente cambiar el orden de los campos en sus definiciones de compensación para que las fechas se pueden ordenar fácilmente:

#define DAY_OFFSET 0 
#define MONTH_OFFSET DAY_BITS 
#define YEAR_OFFSET (DAY_BITS + MONTH_BITS) 
+0

Muchas gracias, pude seguir cómo lo hiciste y comprender el concepto. – David

0

Entonces, ¿dónde comenzamos? El día tiene un máximo de 31, por lo que necesita registrar (32) = 5 bits para eso, pero todavía no le importa esto. Meses es máximo 12 por lo que necesita log (16) = 4 bits para ese El año es máximo 99 por lo que necesita log (128) = 7 bits para ese

Ponga el día en su variable. Ahora giro a la izquierda para hacer espacio para el mes (4 bits) ponen en el mes ahora giro a la izquierda para hacer espacio para el año (7 bits)

Ahora que descomprimir primero obtener días. Deshace ambos turnos. Luego, obtener meses deshacer solo el turno de años. Para obtener años, no necesita cambiar, solo la máscara.

Dado que las máscaras son los últimos n bits del número donde n es el número de bits que le interesan, las máscaras son 2^n - 1 donde n es el número de bits por días, meses, años.

3

El código para empaquetar una fecha es incorrecto. Dibuje un diagrama para cada paso que muestre lo que contendrá cada bit, como este (donde 'D' es un bit que se usa para el día, 'M' es un bit que se usa para el mes, 'Y' es un poco que se utiliza para el año, y son bits que están dañados debido a que contienen tanto el mes y año) '?':

packed = day;  // 0000000000000000000DDDDD 
packed <<= 9;  // 0000000000DDDDD000000000 
packed |= month; // 0000000000DDDDD00000MMMM 
packed << 4;  // 000000DDDDD00000MMMM0000 
packed |= year; // 000000DDDDD00YYY????YYYY 

Nota: Sus máscaras se ven así en binario:

DAY_MASK = 000000DDDDD00000 
MONTH_MASK = 0000MM0000000000 
YEAR_MASK = YY00YYY00YYYYYYY 

Sin haciendo su tarea por usted; Recomiendo encarecidamente que hagas lo mismo que yo: escribe todo en binario para que puedas ver qué bits hacen qué.

Cuestiones relacionadas