位移掩模仍然无法实现

Dav*_*vid 6 c bit-manipulation

有人可以看看这个草率的代码,并向我解释为什么它不起作用.我是否正确包装和拆包?(这个实验的目的是使用位移和屏蔽来打包日期.例如31/12/99的控制台输入将被"或"在一起然后"取消",这是我的代码试图做的.谢谢.

#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;
    }
}
Run Code Online (Sandbox Code Playgroud)

x4u*_*x4u 3

您似乎为月份(0xc00)分配的位太少,并且您的操作方式很难看出您的班次是否正确。

我建议以更一致的方式定义常量,如下所示:

#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  )
Run Code Online (Sandbox Code Playgroud)

...现在您可以像这样设置打包值:

packed = 0;
packed |= ( day   & DAY_MASK   ) << DAY_OFFSET;
packed |= ( month & MONTH_MASK ) << MONTH_OFFSET;
packed |= ( year  & YEAR_MASK  ) << YEAR_OFFSET;
Run Code Online (Sandbox Code Playgroud)

...并获取像这样的单个字段:

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 );
Run Code Online (Sandbox Code Playgroud)

您现在可以简单地更改偏移量定义中字段的顺序,以使日期易于排序:

#define DAY_OFFSET   0
#define MONTH_OFFSET DAY_BITS
#define YEAR_OFFSET  ( DAY_BITS + MONTH_BITS )
Run Code Online (Sandbox Code Playgroud)