BUPT-CSAPP 2019 Fall 2.60 2.65 2.67 2.68

深入理解计算机系统

写在前面:
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的个数奇偶性

考虑数字电路中的奇偶校验码的生成电路(离散同态

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值