2017-2018-1 《信息安全系统设计基础》 20155322 十六周 课上实践

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 ;
}

返回目录

四、代码链接

码云链接
返回目录

原文地址:https://www.cnblogs.com/blackay03/p/8207237.html