2017-2018-1 《信息安全系统设计基础》 20155322 十六周 课上实践
[博客目录]
一、题目
二、原理
这里主要考察的知识点为提取位,即提取一串二进制数中固定的位数。
这里先放上一张老师PPT上的图片:
由图可知,0-4位为秒,5-10位为分钟,11-15位为小时,那么,我们要提取其中的秒分时该怎么做呢?
首先我们需要明白一点:与1&
为置1,与0&
为置0,然后再进行计算:
提取秒:
由于Seconds占低5位,只用&
上1F(0000 0000 0001 1111)取出Seconds的全部5位
00000 000000 11111
& xxxxx xxxxxx xxxxx
= 00000 000000 xxxxx
提取分
由于Seconds占5位,因此需要先右移5位将Minutes的最低位与位0对齐,再&
上3F(0000 0000 0011 1111)取出Minutes的全部6位
xxxxx xxxxxx xxxxx >>>5
= 00000 xxxxx xxxxxx
------------------------
00000 00000 111111
& 00000 xxxxx xxxxxx
= 00000 00000 xxxxxx
提取时:
由于Seconds占5位,Minutes占6位,因此需要先右移11位将Hours的最低位与位0对齐,再&
上1F(0000 0000 0001 1111)即可将5-15位全部清0从而取出Hours的全部5位
假设Hours的5位全为C,Minutes的6位全为B,则:
xxxxx xxxxxx xxxxx >>>11
= 00000 000000 00000
------------------------
00000 000000 11111
& xxxxx xxxxxx xxxxx
= 00000 000000 xxxxx
三、实现
时的设置及提取
#define TIME_Addr 0xFFFFC0000 //实时钟芯片的IO映像基址是OxFFFFC0000
#define TIME *(volatile int *) (TIME_Addr+2) //时间存放在基址+2的寄存器中
void SetHours(int hours)
{
int oldtime = TIME;
int newtime = oldtime & ~ (0x1F << 11);
newtime |= (hours & 0x1F) << 11;
TIME = newtime;
}
int getHours()
{
int time;
time = (time>>11) & 0x1F;
return time;
}
秒的设置及提取
#define TIME_Addr 0xFFFFC0000 //实时钟芯片的IO映像基址是OxFFFFC0000
#define TIME *(volatile int *) (TIME_Addr+2) //时间存放在基址+2的寄存器中
void SetSeconds(int seconds)
{
int oldtime=TIME;
int newtime=oldtime&~0x1F;
newtime|=seconds&0x1F;
TIME=newtime;
}
int getSeconds()
{
int time;
time=time&0x1F;
return time ;
}