深入理解计算机系统
写在前面:
1.这是我的个人作业,在这里写什么样我交上去就是什么样,希望各位不要原样抄袭。
2.这里的题目只是我OCR了方便搜索,真要看题目还是得书。
3.CSDN的Markdown编辑器和我本地的不完全一样,尤其是LaTeX的语法支持,如果有部分语法错误导致公式无法显示的,请告知我~
P88 2.60 替换字节
首先看常见位运算符搭配0/1使用时的作用,x指某一位
x&0=0 可用于位的清除 x&1=x 无用 x|1=1 可以用于位的置1 x|0=x 无用
x^1=~x 可用于位的取反 x^0=x 无用
对于0x12345678,首先考虑把要替换的字节置为0或1,再将新的字节添加上去
要将字节置零,考虑用0x00的字节去和该位置&,其他字节保持不变就&0xFF,所以对于例子,就用0xFF00FFFF与其&。这个数比较难生成,考虑生成其取反~,即0x00FF0000,其是由0xFF左移两个字节得到的,也就是2字节*8位/字节=16位。由于乘以2的整数倍可以用移位实现,即2*8=2<<3。需要对0xFF左移i个字节就是移动i<<3位。目标字节置零操作为
0x12345678 & ~(0xFF<<(2<<3)),推广之,为x & ~(0xFF<<(i<<3))
接下来考虑把新的字节0xAB替换上,先移到对应的位置0xAB<<(2<<3),得到0x00AB0000,再和0x12005678逐位相加,由于这里两个数相加时,不为零的的字节相加的对方全是0,可以用异或^,也可以用或|
所以整体代码为,两者都可
unsigned replace_byte(unsigned x,int i,unsigned char b){
return (x& ~(0xFF<<(i<<3))) | (b<<(i<<3));
// return (x& ~(0xFF<<(i<<3))) ^ (b<<(i<<3));
}
P90 2.65 1的个数奇偶性
考虑数字电路中的奇偶校验码的生成电路(离散同态