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)
您似乎为月份(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)