CSAPP-datalab

本文介绍了多个基于位运算的编程题目,包括bitAnd、getByte、logicalShift等,每个题目提供了详细的解题方法和代码实现,涉及位操作如德摩根定理、右移、逻辑非等,并讨论了特定限制条件下的解题策略。

写在前面的话:
这个实验网上已经有很多版本的实现方式了,对于我这个编程菜鸟而言这个实验真的很难,建议大家第一次做的时候先挑软柿子捏,把自己能想出来的先做完后再去想难的,真的想不出来就及时看网上其他人的实现思路。全部做完后隔几天再做一次,相信你能有全新的理解。


1.bitAnd


1.1【题目要求】

/*
bitAnd - 使用 ~ 和 | 实现 x&y
例子:bitAnd(6, 5) = 4
合法操作:~ |
最大操作数:8
难度评级:1
*/

1.2【解题方法】

运用德摩根定理,x&y <==> ~ ((~ x) | (~ y))

1.3 【代码】

int bitAnd(int x, int y) {
   
   
  return ~((~x) | (~y));
}

2.getByte


2.1 【题目要求】

/*
getByte - 从一个字中提取第n个字节
字节从0(LSB)到3(MSB)编号
例子:getByte(0x12345678,1)= 0x56
合法操作:!〜&^ | + << >>
最大操作数:6
难度评级:2
*/

2.2 【解题方法】

先将n扩大8倍,由于不能使用*操作,所以只能用左移3位来代替;
再将x右移n位,这要所要求的那个字节就会来到最后八位,最后再用16进制数0xff与x相与即可;

2.3 【代码】

int getByte(int x, int n) {
   
   
  n<<=3;
  x>>=n;
  return (x & 0xff);
}

3.logicalShift


3.1 【题目要求】

/*
logicalShift - 使用逻辑右移将 x 向右移动 n 位
可假设 0 <= n <= 31
例子:logicalShift(0x87654321,4) = 0x08765432
合法操作:!〜&^ | + << >>
最大操作数:20
难度评级:3
*/

3.2 【解题方法】

逻辑右移是不考虑所输入的数的符号位的,高位自动补0,在这个程序的开头的提示中说,假设所有的右移都为算数右移“2. Performs right shifts arithmetically.”,所以直接使用右移操作符>>会导致结果出错;所以就要对结果进行修正。修正的目的在于将右移后的高n为全部变为零,即我们要构造一个高n位为0低32-n位为1的数与算数右移n位后的x相与再返回最终结果;

3.3 代码

错误示例:

int logicalShift(int x, int n) {
   
   
  int y=(1<<31)>>n;
x>>=n;
  return (x & (~y));
}

在一开始我直接想当然的采取上述方法进行操作,发现结果是错误的,原因在于y再右移的过程中虽然也是移了n位,但是由于本身其第31位就存在一个1,导致右移n位后变成了高n+1位都为1;
例如假设右移三位,则y一开始为0x10000000,右移三位后变为0xf0000000,这就变成了高四位为1,而我们只想要高3位为1,这个时候就要对于y做进一步修正,使其左移1位;

int logicalShift(int x, int n) {
   
   
  int y=(1<<31)>>n;
  y<<=1;
  x>>=n;
  return (x & (~y));
}

而且我发现这个程序很矫情的一个点是,你所有的变量必须在一开始就声明,例如上面函数中的y,如果你不一开始就声明出来他,编译的时候就会报错:
例如:

int logicalShift(int x, int n) {
   
   
  x>>=n;
int y=(1<<31)>>n;
  y<<=1;
  x>>=n;
  return (x & (~y));
}

4.bitCount


4.1 【题目要求】

/*
bitCount - 返回 word 中 1 的个数
例如:bitCount(5) = 2,bitCount(7) = 3
合法操作:! ~ & ^ | + << >>
最大操作数:40
难度等级:4
*/‘

4.2 【解决方案+代码】

int bitCount(int x) {
   
   
  int c,t1,t2,t3,t4,t5;
  t1=0x55|((0x55)<<8);<
### CSAPP DataLab 武汉大学 `subok` 参数教程 #### 关于 CSAPP DataLab 的背景介绍 CSAPP DataLab 是《计算机系统基础》(Computer Systems: A Programmer's Perspective, CSAPP)教材中的一个重要实验部分,旨在通过一系列基于位运算的操作加深学生对底层硬件和数据表示的理解[^1]。 在完成 DataLab 中的任务后,通常需要将解决方案上传到特定的服务器进行验证。这一过程涉及到了一个名为 `subok` 的参数设置问题。以下是关于如何正确配置以及提交的相关说明: #### 配置与使用 `subok` 参数 当准备向官方或者学校指定平台提交代码时,确保命令行工具能够识别并接受额外选项是非常重要的一步。具体来说,在执行如下形式的提交指令前需确认环境变量已正确定义好: ```bash make submit SUBMITTY_URL="http://your-submission-server/" COURSE_ID="csapp-datalab" USER_ID="wuhan-university-student" ``` 其中涉及到的关键点之一就是——是否允许未优化版本也成功递交?这便是由布尔型标志 `subok` 来决定的事情。如果将其设为 true,则即使某些题目未能达到最优解法的要求也能顺利完成整个流程;反之则会阻止不符合标准的结果被接收[^2]。 因此,在实际操作过程中需要注意以下几点事项来保障顺利通过检验环节: - **检查本地测试结果**:利用自带脚本如 `./btest` 对各个实现逐一校验其功能性和效率指标; ```bash make && ./btest -f functionName [-param value ...] ``` - **调整适当编译器警告级别**:有时候看似无害的小错误可能隐藏着逻辑隐患,故建议启用更严格的检测机制以便及时发现潜在缺陷; - **明确了解评分细则**:不同院校可能会依据实际情况定制化评判准则,务必提前查阅清楚后再着手修改源文件内容直至满足预期目标为止[^3]。 最后附上一段简单示例展示如何构造符合规范要求下的基本框架结构供参考学习之用: ```c /* * Example Function Implementation According To Given Constraints. */ int exampleFunction(int input){ int mask = 0xFFFFFFFF; return ((input >> 1) & mask); } ``` #### 注意事项总结 综上所述,为了保证能够在武汉大学或者其他任何采用相同体系架构的教学场景下高效完成相应练习项目,请牢记上述提到的各项要点,并严格按照指导手册上的提示逐步推进各项工作进程即可达成理想效果[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值