6
votes

Les masques de bits changeants m'ont encore échappé

Quelqu'un pourrait-il s'il vous plaît jeter un oeil à ce code bâclé et m'expliquer pourquoi cela ne fonctionne pas. Suis-je emballer et déballer les choses correctement? (L'objet de ce laboratoire était d'emballer une date à l'aide de la décalage de bits et du masquage. Par exemple, la saisie de la console du 31/12/99 serait ORDOI ALORNE ALORNE ANDÉE, laquelle est ce que mon code tentait de faire. Merci .

#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;
    }
}


10 commentaires

Quand il fonctionne, si je saisis une date de 31,12,99, je devrais avoir les mêmes résultats du côté de la sortie, mais je ne le fais pas. Très probablement due à un mauvais changement et / ou masquage, lequel est où je pense avoir besoin de la plus grande aide.


Comment obtenez-vous l'année pour s'intégrer en quatre bits?


Emballé = jour; Emballé << = 9; Emballé | = mois; Emballé << = 4; Emballé | = année;


Le mois est seulement 1-12 - qui s'intégrerait à quatre bits, mais vous le donnez 9. L'année prendrait 7 bits, mais vous ne le donnez que 4.


Année_mask semble étrange pour moi. Êtes-vous sûr que c'est vrai?


Vous orientons efficacement le mois et l'année ensemble, car vous changez de mois 4 lorsque vous avez besoin de faire de la place pour l'année.


Je ne suis pas sûr du masque, j'ai été Googel'ing pour trouver un bon texte sur la façon de dériver mon masque. Mes masques actuels sont de mauvaises suppositions au mieux.


Écrivez en binaire les numéros max dont vous avez besoin pour représenter. Max Jour est 31 - 11111. Le mois maximum est de 12 à 11h00. Max Année est de 99 - 1100011. Vous avez donc besoin de 5 bits pour la journée, 4 ans pour le mois, 7 ans pour l'année.


Ok, je pense que je saisis cela maintenant. "Emballé << = 4" ne fait rien de plus que de déplacer 4 bits à l'intérieur de l'emballage, puis de "emballé | = mois" placerait le mois de 4 bits dans l'espace que nous venons d'attribuer. Est-ce exact? Comment puis-je trouver mon masque?


Si j'étais vous, je ne changerais pas de remplissage, plutôt que je changeais vos jours, des années, des mois, etc. Ie emballé | = (jour >> Somenumber)


3 Réponses :


3
votes

Vous semblez avoir trop peu de bits assignés pendant un mois (0xc00) et votre façon de le faire, il n'est pas facile de voir si vos changements sont corrects.

Je suggérer de définir vos constantes de manière plus cohérente comme Ceci: p> xxx pré>

... MAINTENANT, vous pouvez désormais définir la valeur emballée comme ceci: p> xxx pré>

... et obtenir Les champs simples comme celui-ci: p> xxx pré>

Vous pouvez maintenant simplement modifier l'ordre des champs dans vos définitions de décalage pour rendre les dates facilement triables: p>

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


1 commentaires

Merci beaucoup, j'ai pu suivre comment vous l'avez fait et saisir le concept.



0
votes

Alors, où commençons-nous? Le jour est max 31, vous avez donc besoin de log (32) = 5 bits pour cela, mais vous ne vous en souciez pas encore à ce sujet. Mois est max 12, vous avez donc besoin de log (16) = 4 bits pour cela Année est max 99, vous avez donc besoin de log (128) = 7 bits pour cela

Mettez la journée dans votre variable. Maintenant, passez à gauche pour faire de la place pour le mois (4 bits) mettre le mois dans Maintenant, passez à gauche pour faire de la place pour l'année (7 bits)

Maintenant pour déballer d'abord des jours. Annuler les deux changements. Puis pour obtenir des mois d'annuler juste les années passées. Pour obtenir des années, vous n'avez pas besoin de changer, juste le masque.

Étant donné que les masques sont les derniers n bits du numéro où n est le nombre de bits qui vous intéressent, les masques sont 2 ^ n-1 où n est le nombre de bits pendant des jours, des mois, des années.


0 commentaires

3
votes

Le code pour emballer une date est incorrect. Dessinez un diagramme pour chaque étape indiquant ce que chaque bit contiendra, comme celui-ci (où 'd' est un peu utilisé pour la journée, 'M' est un peu utilisé pour le mois, 'y' est un peu C'est utilisé pour l'année et '? xxx

sans faire vos devoirs pour vous; Je vous recommande vivement de faire la même chose: écrivez tout en binaire afin que vous puissiez voir quels bits font quoi.


0 commentaires