📄 ex3-3.cpp
字号:
//示例位段组织和模拟位段实现,不考虑输入错误
#include <iostream>
using namespace std;
typedef struct
{
unsigned year:12;
unsigned month:4;
unsigned day:5;
unsigned clock:5;
unsigned minute:6;
unsigned second:6;
} TIME;
typedef struct
{
// unsigned ex:32;
unsigned :0;
} TIME1;
void display(char *p)
{
char pi=*p;//*(int*)
// cout<<"int:"<<pi<<endl;
for(int i=0;i<8;i++)
{
if(pi<0)
cout<<'1';
else
cout<<'0';
pi<<=1;
}
cout<<endl;
}
void writeyear(unsigned short *p,unsigned short us)
{
unsigned short test;
test=(~0)<<12;
// cout<<test<<endl;
(*p)&=test;
test=~test;
us&=test;
(*p)|=us;
cout<<*p<<endl;
}
void writemonth(char *p,unsigned short us)
{
char test;
test=(char)~(15<<4);
// cout<<(int)test<<endl;
(*p)&=test;
us=us<<4;
(*p)|=us;
cout<<(int)*p<<endl;
}
void writeday(char *p,unsigned short us)
{
char test;
test=(char)(7<<5);
cout<<(int)test<<endl;
(*p)&=test;
(*p)|=us;
cout<<(int)*p<<endl;
}
void writetime(unsigned short *p,unsigned short us)
{
unsigned short test;
test=~(31<<5);
cout<<test<<endl;
(*p)&=test;
cout<<*p<<endl;
test=~test;
us=us<<5;
us&=test;
(*p)|=us;
cout<<*p<<endl;
}
void writeminute(char *p,unsigned short us)
{
char test;
test=(char)~(63<<2);
// cout<<(int)test<<endl;
(*p)&=test;
us=us<<2;
(*p)|=us;
cout<<(int)*p<<endl;
}
void writesecond(char *p,unsigned short us)
{
char test;
test=(char)(3<<6);
cout<<(int)test<<endl;
(*p)&=test;
(*p)|=us;
cout<<(int)*p<<endl;
}
//
//
void readyear(unsigned short *p,unsigned short &us)
{
unsigned short test;
test=~((~0)<<12);
// cout<<test<<endl;
us=(*p)&test;
cout<<us<<"年"<<endl;
}
void readmonth(char *p,unsigned short &us)
{
char test;
test=(char)(15<<4);
us=(((*p)&test)>>4)&15;
cout<<us<<"月"<<endl;
}
void readday(char *p,unsigned short &us)
{
char test;
test=(char)(31);
us=(*p)&test;
cout<<us<<"日"<<endl;
}
void readtime(unsigned short *p,unsigned short &us)
{
unsigned short test;
test=(31<<5);
us=((*p)&test)>>5;
cout<<us<<"时"<<endl;
}
void readminute(char *p,unsigned short &us)
{
char test;
test=(char)(63<<2);
// cout<<(int)test<<endl;
us=(((*p)&test)>>2)&63;
cout<<us<<"分"<<endl;
}
void readsecond(char *p,unsigned short &us)
{
char test;
test=(char)(63);
us=(*p)&test;
cout<<us<<"秒"<<endl;
}
void clear(char *p)
{
for(int i=0;i<sizeof(TIME);i++,p++)
*p=0;
}
void main(void)
{
cout<<sizeof(TIME1)<<endl;
TIME time1;
char *pc=(char*)&time1;
clear(pc);
time1.year=2006;//0111,1101,0110
time1.month=3;//0011
time1.day=7;//00111
time1.clock=9;//01001
time1.minute=14;//001110
time1.second=50;//110010
for(int i=0;i<8;i++,pc++)
display(pc);
cout<<endl;
cout<<time1.year<<endl;
//模拟位段实现
unsigned short tmp;
unsigned char time2[5]={0,0,0,0,0};
//写位段的实现
//写year
cout<<"Please input year(1~4095):";
cin>>tmp;
writeyear((unsigned short*)time2,tmp);
//写month
cout<<"Please input month(1~12):";
cin>>tmp;
writemonth(1+(char*)time2,tmp);
//写day
cout<<"Please input day(1~31):";
cin>>tmp;
writeday(2+(char*)time2,tmp);
//写time
cout<<"Please input time(0~23):";
cin>>tmp;
writetime((unsigned short*)&time2[2],tmp);
//写minute
cout<<"Please input minute(0~59):";
cin>>tmp;
writeminute((char*)&time2[3],tmp);
//写second
cout<<"Please input second(0~59):";
cin>>tmp;
writesecond((char*)&time2[4],tmp);
//读位段的实现
//读year
readyear((unsigned short*)time2,tmp);
//读month
readmonth(1+(char*)time2,tmp);
//读day
readday(2+(char*)time2,tmp);
//读time
readtime((unsigned short*)&time2[2],tmp);
//读minute
readminute((char*)&time2[3],tmp);
//读second
readsecond((char*)&time2[4],tmp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -