要求
在作业本上完成附图作业,要认真看题目要求。
提交作业截图
作弊本学期成绩清零(有雷同的,不管是给别人传答案,还是找别人要答案都清零)
分析例子
提取minutes
一共16位,minutes占10-5+1=6位,seconds占4-0+1=5位
所以time>>5使得minutes被放到了最右边
为了只剩下minutes,故而要把16位中除后6位以外的数都变成0
所以要用0去&
又因为0000000000111111=0x3F
所以(time>>5)&0x3F
设置minutes
把原时间的分钟全部置零
按位与
0x3F<<5 = 0000011111100000
取反后1111100000011111
与原来的数相与,则minutes位置零
把上一步提取出来的分钟左移五位放置到正确的位置,再与新时间相或
提取和设置hours
取出时间
volatile
volatile是一个类型修饰符(type specifier),就像大家更熟悉的const一样,它是被设计用来修饰被不同线程访问和修改的变量。
volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
结果
#define DATA 0xFFFFC0002 //IO映像基址是OxFFFFC0000,时间在基址+2
#define TIME *(volatile int *)(DATA) //类型转换
int getHours();
把时间从TIME取出来
hours一共5位,16-5=11,所以应该右移11位
0000000000011111 = 0x1f
int getHours() //取出Hours
{
int time=TIME;
return (time>>11)&0x1f;
}
void SetHours(int hours);
时间取到oldtime
0000000000011111 = 0x1f
1111100000000000 = 0x1f<<11
0000011111111111 = ~(0x1f<<11)
void SetHours(int hours) //插入Hours
{
int oldtime=TIME;
int newtime;
newtime=oldtime&~(0x1F<<11);
newtime|=(hours&0x1F)<<11;
TIME=newtime;
}
方法二:
newtime=oldtime&7ff;
newtime|=(hours<<11)&f800;
int geSeconds();
int getSeconds() //取出Seconds
{
int time=TIME;
return time&0x1f;
}
void SetSeconds(int Seconds);
1111111111100000 = 0xffe0
{
int oldtime=TIME;
int newtime;
newtime = oldtime&0xffe0;
newtime|= Seconds&0x1F;
TIME=newtime;
}