《信息安全系统设计基础》家庭作业2.65、2.71、4.57、7.7、8.18、8.23

《信息安全系统设计基础》家庭作业2.65、2.71、4.57、7.7、8.18、8.23

2.65

  • 解读题目:当无符号数x包含偶数个1时,返回值为1,否则为返回值为0,假设x的数据类型是int 有w=32位。
  • 解题思路:要求x所包含的1的个数,可以对x的每个位进行异或运算。如果得到的结果是0,那么就说明x包含偶数个1,则返回值为1,;如果得到的结果是1,那么说明x包含奇数个1,则返回值为0。
  • 代码编写过程:由于x是个32位int类型数,所以
    ①首先采用折半缩小规模的方法进行逐位异或;
    ②最后得到的x值再与1进行与运算就会得到一个32位中前31均为0,尾数是0或者是1(用于判断是原x包含奇数还是偶数个1);
    ③返回这个值就完成了题目需求。
  • 代码编写:
int even_ones(unsigned x){
x ^= (x >> 16);//等同于x=x^(x>>16)
x ^= (x >> 8); //等同于x=x^(x>>8)
x ^= (x >> 4); //等同于x=x^(x>>4)
x ^= (x >> 2); //等同于x=x^(x>>2)
x ^= (x >> 1); //等同于x=x^(x>>1)
return !(x&1);
}

截图:

  • 运行结果如下:

    即当a为10e5+0时,返回值为0
    若a为10e5+1时,返回值为1

2.71
A.得到的结果是unsigned,而并非扩展为signed的结果。
B.使用int,将待抽取字节左移到最高字节,再右移到最低字节即可。

//代码编写如下:
int xbyte(unsigned word, int bytenum){
    int ret = word << ((3 - bytenum)<<3);
    return ret >> 24;
}

4.57
A.发现加载/使用冒险的逻辑公式:

( E_icode in {IMRMOVL, IPOPL} && E_dstM in {d_srcA, d_srcB}) 
&&
!(E_icode == IMRMOVL && D_icode == IPUSHL);

B.

e_valA = [ (E_icode==IPUSH) && (M_dstM==E_srcA) : m_valM;
            1 : E_valA; 
         ];

7.7

输出错误的原因是全局符号x被多重定义,若想输出正确的值,可以将bar5.c中的x变成局部变量,将其移到void f()的括号中即可。

8.18

画出进程图如下,可知在A.112002 B.211020 C.102120 D.122001 E.100212中,A/C/E是可能的。

8.23
原因:在第一个信号发给父进程之后,父进程进入handler,并且阻塞了SIGUSR2,此时第二个信号依然可以发送,但是之后的3个信号就会被抛弃。所以只有2个信号被接收。<\font>

posted @ 2016-11-30 21:07  20145212罗天晨  阅读(181)  评论(0编辑  收藏  举报