《信息安全系统设计基础》家庭作业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>