1、bitAnd

(1)Instructions

  • getByte - Extract byte n from word x
  • Bytes numbered from 0 (LSB) to 3 (MSB)
  • Examples: getByte(0x12345678,1) = 0x56
  • Legal ops: ! ~ & ^ | + << >>
  • Max ops: 6
  • Rating: 2

(2)代码

德·摩根定律:
非(A且B) = (非A) 或(非B)
非(A或B) = (非A) 且(非B)

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

2、getByte

(1)Instructions

  • logicalShift - shift x to the right by n, using a logical shift
  • Can assume that 0 <= n <= 31
  • Examples: logicalShift(0x87654321,4) = 0x08765432
  • Legal ops: ! ~ & ^ | + << >>
  • Max ops: 20
  • Rating: 3

(2)代码
int数据有四个字节,一个字节有8位,所以取第n个字节,即取第n<<3位开始的8位。
要获取x中的第n个字节,可以考虑先将要得到的字节移位到第0个字节的位置,然后将其与0xff进行&运算。

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

3、logicalShift

(1)Instructions

  • logicalShift - shift x to the right by n, using a logical shift
  • Can assume that 0 <= n <= 31
  • Examples: logicalShift(0x87654321,4) = 0x08765432
  • Legal ops: ! ~ & ^ | + << >>
  • Max ops: 20
  • Rating: 3

(2)代码
算数右移是在左边补最高位,逻辑右移是是补0。
可以先将int型数据进行算数右移,然后将其与最高n位为0其他位为1的数[~((1<<31)>>(n-1))]进行&运算使得最高的n位变为0。

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

4、bitCount

(1)Instructions

  • bitCount - returns count of number of 1’s in word
  • Examples: bitCount(5) = 2, bitCount(7) = 3
  • Legal ops: ! ~ & ^ | + << >>
  • Max ops: 40
  • Rating: 4

代码
Divide and Conquer~
计算1的个数就相当于计算x的二进制串的所有位的和。首先将int型数据x的32位分成16组,并进行X31+X30,X29+X28,…,X3+X2,X1+X0的运算;然后将x分成8组,并进行X31+X30+X29+X28,…,X3+X2+X1+X0的运算。依次类推,接着将x分成4组,2组并进行相应的运算。最后只剩下1组,此时将所有的位进行相加即得到了最终结果。

int bitCount(int x)
{int x1 = 0, x2 = 0, x3 = 0, x4 = 0, x5 = 0, y = 0;x1 = 0x55 | (0x55 << 8);x1 = x1 | (x1 << 16);x2 = 0x33 | (0x33 << 8);x2 = x2 | (x2 << 16);x3 = 0x0f | (0x0f << 8);x3 = x3 | (x3 << 16);x4 = 0xff | (0xff << 16);x5 = 0xff | (0xff << 8);y = (x & x1) + ((x >> 1) & x1);y = (y & x2) + ((y >> 2) & x2);y = (y & x3) + ((y >> 4) & x3);y = (y & x4) + ((y >> 8) & x4);y = (y & x5) + ((y >> 16) & x5);return y;
}

5、bang

(1)Instructions

  • bang - Compute !x without using !
  • Examples: bang(3) = 0, bang(0) = 1
  • Legal ops: ~ & ^ | + << >>
  • Max ops: 12
  • Rating: 4

(2)代码
因为每个非0的int型数据和它的相反数进行 | 运算后,最高位为1;如果x为0,进行上述操作后最高位仍为0。

int bang(int x)
{int y,z;y=x|((~x)+1);z=y>>31+1;return z;
}

6、tmin

(1)Instructions

  • tmin - return minimum two’s complement integer
  • Legal ops: ! ~ & ^ | + << >>
  • Max ops: 4
  • Rating: 1

(2)代码
最小二进制补码整数即符号位为1,其他位全为0。

int tmin(void)
{int x;x=1<<31;return x;
}

7、fitsBits

(1)Instructions

  • fitsBits - return 1 if x can be represented as an n-bit, two’s complement integer.
  • 1 <= n <= 32
  • Examples: fitsBits(5,3) = 0, fitsBits(-4,3) = 1
  • Legal ops: ! ~ & ^ | + << >>
  • Max ops: 15
  • Rating: 2

代码
如果int型数据x可以表示为n位二进制补码整数(其中1 <= n <= 32),则返回1,否则返回0。
n位二进制能表示的最大整数为最高位为0,其他位为1;最小数为最高位为1,其他位为0。我们可以将x右移n-1位(n+(~0))后,再将其与符号位比较,两者相同说明x可以表示位n位二进制数。

int fitsBits(int x, int n)
{int y,z,t;y=x>>31;z=x>>(n+(~0));t=!(y^z);return t;
}

8、divpwr2

(1)Instructions

  • divpwr2 - Compute x/(2^n), for 0 <= n <= 30
  • Round toward zero
  • Examples: divpwr2(15,1) = 7, divpwr2(-33,4) = -2
  • Legal ops: ! ~ & ^ | + << >>
  • Max ops: 15
  • Rating: 2

(2)代码
除法运算,对于非负数是默认向0取整;但对负数来说,需要字啊移位之前加一个偏置量(biasing)处理一下,即2^k-1。

int divpwr2(int x, int n)
{int sign = 0, var = 0;sign = x >> 31;var = (1 << n) + (~0);return (x + (sign & var)) >> n;
}

9、negate

(1)Instructions

  • negate - return -x
  • Example: negate(1) = -1.
  • Legal ops: ! ~ & ^ | + << >>
  • Max ops: 5
  • Rating: 2

(2)代码
x相反数就是x取反+1

int negate(int x)
{int z;z=(~x)+1;return z;
}

10、isPositive

(1)Instructions

  • isPositive - return 1 if x > 0, return 0 otherwise
  • Example: isPositive(-1) = 0.
  • Legal ops: ! ~ & ^ | + << >>
  • Max ops: 8
  • Rating: 3

(2)代码
对于int型数据x,如果x > 0,返回1,否则返回0。
设flag(x)表示x的符号,+为0,-为1;

当x>0时,isPositive(x)=1,flag(x)=0,!x=0;
当x<0时,isPositive(x)=0,flag(x)=1,!x=0;
当x=0时,isPositive(x)=0,flag(x)=0,!x=1;

因为当flag(x)和!x均为0时,isPositive(x)返回1;所以可以将flag和!x进行 | 运算,然后将得到的结果取 ! 。

int isPositive(int x)
{int flag,z;flag=(x>>31)&0x1;z=!(t|(!x));return z;
}

11、isLessOrEqual

(1)Instructions

  • isLessOrEqual - if x <= y then return 1, else return 0
  • Example: isLessOrEqual(4,5) = 1.
  • Legal ops: ! ~ & ^ | + << >>
  • Max ops: 24
  • Rating: 3

(2)代码
对于int型数据x和y,如果x <= y,则返回1,否则返回0。
可以先求出两个数的差值t,即t<=0返回1,t>0返回0;然后参考isPositive函数。

int isLessOrEqual(int x, int y)
{int m = 0, n = 0, r = 0, result = 0,t = 0;m = (x >> 31) & 0x1;n = (y >> 31) & 0x1;r = !(m ^ n);result = x + (~y) + 1;t=(r & ((result >> 31) | (!result))) | ((!r) & m);return t;
}

12、ilog2函数

(1)Instructions

  • ilog2 - return floor(log base 2 of x), where x > 0
  • Example: ilog2(16) = 4
  • Legal ops: ! ~ & ^ | + << >>
  • Max ops: 90
  • Rating: 4

(2)代码
返回log2x的值,返回结果为int型。
这个函数就是要找到最接近一个数n使得2n最接近x,且满足2n <= x。因此可以先将int型数据x右移16位,并进行两次取反操作,如果得到的值为1,则说明x的高16位中存在至少一个1,那么result应加上16;如果得到的值为0,则说明高16位中不存在1。然后再将x右移(result+8)位,同样进行两次取反操作,如果得到的值为1,则说明在(result+8)和(result+15)这8位中至少有一个1,那么result应加上8;如果得到的值为0,则说明这8位中不存在1。依次类推,继续将x右移(result+4),(result+2),(result+1)位,并进行同样的操作即可得到最终结果。

int ilog2(int x)
{int y = 0;y = (!!(x >> 16)) << 4;y = y + ((!!(x >> (y + 8))) << 3);y = y + ((!!(x >> (y + 4))) << 2);y = y + ((!!(x >> (y + 2))) << 1);y = y + (!!(x >> (y + 1)));return y;
}

13、float_neg

(1)Instructions

  • float_neg - Return bit-level equivalent of expression -f for floating point argument f. Both the argument and result are passed as unsigned int’s, but they are to be interpreted as the bit-level representations of single-precision floating point values. When argument is NaN, return argument.
  • Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while
  • Max ops: 10
  • Rating: 2

(2)代码
返回浮点参数f的表达式-f的位等效项。参数和结果都作为无符号int传递,但是它们将被解释为单精度浮点值的位级表示。 当参数为NaN时,返回参数。
函数的参数可能为NaN,所以需要进行判断。如果参数uf的第23位到第30位全为1,而且uf的低23位不为0,这说明uf解释为单精度浮点值的位级表示时是一个NaN,所以应该直接返回,否则应直接将uf的最高位(符号位)取反即可得到-f。

unsigned float_neg(unsigned uf)
{unsigned w,x,y,z,t;w=(1<<23)-1;x=0xff<<23;y=uf&w;z=uf&x;if ((z==x)&&y){return uf;}t=(1<<31)^uf;return t;
}

14、float_i2f

(1)Instructions

  • float_i2f - Return bit-level equivalent of expression (float) x. Result is returned as unsigned int, but it is to be interpreted as the bit-level representation of a single-precision floating point values.
  • Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while
  • Max ops: 30
  • Rating: 4

(2)代码
返回表达式(浮点数)x的等价位。 结果以unsigned int形式返回,但是将其解释为单精度浮点值的位级表示。

unsigned float_i2f(int x)
{unsigned sign = 0, enow = 0, fnow = 0, absx = x,shiftLeft = 0, tail = 0, result = 0;unsigned pos = 1 << 31;if (x == 0) {return 0;}else if (x < 0) {absx = -x;sign = pos;}while ((pos & absx) == 0) {absx <<= 1;shiftLeft += 1;}enow = 127 + 31 - shiftLeft;tail = absx & 0xff;fnow = (~(pos >> 8)) & (absx >> 8);result = sign | (enow << 23) | fnow;if (tail > 0x80) {result += 1;} else if (0x80 == tail){if (fnow & 1) {result += 1;}}return result;
}

15、float_twice

(1)Instructions

  • float_twice - Return bit-level equivalent of expression 2*f for floating point argument f. Both the argument and result are passed as unsigned int’s, but they are to be interpreted as the bit-level representation of single-precision floating point values. When argument is NaN, return argument.
  • Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while
  • Max ops: 30
  • Rating: 4

(2)代码
返回浮点参数f的表达式2 * f的位等效项。 参数和结果都作为unsigned int传递,但是它们将被解释为的位级表示。单精度浮点值。当参数为NaN时,返回参数。

unsigned float_twice(unsigned uf)
{unsigned sign = 0, enow = 0, fnow = 0;unsigned pos = 1 << 31;unsigned frule = (1 << 23) - 1;if (uf == 0) {return 0;}if (uf == pos) {return uf;}sign = uf & pos;enow = (uf >> 23) & 0xff;if (enow == 0xff) {return uf;}fnow = uf & frule;if (enow == 0){fnow = fnow << 1;if (fnow & (1 << 23)) {fnow = fnow & frule;enow += 1;}} else {enow += 1;}return sign | (enow << 23) | fnow;
}

CSAPP datalab实验相关推荐

  1. CSAPP Lab2 实验记录 ---- Bomb Lab(Phase 1 - Phase 6详细解答 + Secret Phase彩蛋解析)

    文章目录 Lab 总结博客链接 实验前提引子 实验需要指令及准备 Phase 1 Phase 2 Phase 3 Phase 4 Phase 5 Phase 6 Phase Secret(彩蛋Phas ...

  2. CSAPP Lab5实验记录 ---- Shell Lab(实验分析 + 完整代码)

    文章目录 Lab 总结博客链接 前引 Lab5 Shell Lab 1.获取相关Lab材料 2.Overview(总览) 3.Explore(实现前的摸索) 4.函数实现 + 实现代码分析 1.eva ...

  3. 计算机基础实验_lab1(CSAPP datalab)

    NPU_CS_DataLab 计算机系统基础实验_数据表示 1. bitAnd 2. upperBits 3. anyEvenBit 4. leastBitPos 5. byteSwap 6. isN ...

  4. CSAPP:DataLab实验

    目录 前言 实验内容及操作步骤 操作步骤 一.安装dlc 二.阅读引导以及注意事项 [datalab-handout下的bits.c文件中的引导以及注意事项] 三.函数实现 实验结果及分析 前言 本实 ...

  5. csapp bufbomb实验

    csapp (<深入理解计算机系统>)一书中有一个关于缓冲区溢出的实验,其程序代码如下: /* Bomb program that is solved using a buffer ove ...

  6. 《深入理解计算机系统》(CSAPP)实验三 —— Buf Lab

    这是CSAPP的第三个实验,主要让我们熟悉GDB的使用,理解程序栈帧的结构和缓冲区溢出的原理. 实验目的   本实验的目的在于加深对IA-32函数调用规则和栈结构的具体理解.实验的主要内容是对一个可执 ...

  7. csapp炸弹实验_bomb_lab详解

    个人博客:sekyoro.top 之前图床挂了(没错是gitee),现在更新一下 文章目录 开始的准备 objdump与gdb常用命令 objdump gdb readelf 正式开始 initial ...

  8. CSAPP Lab3 实验记录 ---- Attack Lab(Ctarget)

    文章目录 Lab 总结博客链接 前引 实验前准备 Part I: Code Injection Attacks Test 1 Test 2 Test 3 结尾 Lab 总结博客链接 CSAPP Lab ...

  9. 《深入理解计算机系统》(CSAPP)实验七 —— Malloc Lab

    文章目录 隐式空闲链表 分离的空闲链表 显示空闲链表 1. 实验目的 2. 背景知识 3. Implicit list mm_init extend_heap mm_malloc find_fit p ...

最新文章

  1. 一个合格网络管理员的成长经历
  2. vmware智能资源调整
  3. ASP.NET MVC:缓存功能的设计及问题
  4. npm 更换插件版本_Node CLI 工具的插件方案探索
  5. Android 免费模式将终结?
  6. 景驰无人车总部落户广州:明年最低量产500辆,回应百度官司
  7. 关于C#_ArrayList的两篇文章
  8. C++程序设计基础(5)sizeof的使用
  9. some any oracle,Oracle Any/Some运算符
  10. Laravel User Agent 轻松识别客户端(微信)信息(2019版)
  11. 金山词霸2006常规窗口不见了!只能看到最大化的的原因
  12. 数据结构试卷及答案(一)
  13. 腾讯云买服务器密码,腾讯云服务器初始密码是什么?
  14. iphone拍照标注转发微博应用--Gurgle 发布
  15. Linux 一条命令删除某端口被占用的进程
  16. 用html制作问卷调查
  17. 强化学习之探索与利用(一)
  18. linux 射击 游戏,Ubuntu下安装第一人称射击游戏 Nexuiz 2.4.2(图)
  19. RK3128-室内机视频对讲主板方案
  20. html自动分行工具,自动HTML简化工具?

热门文章

  1. Linux 系统USB设备检测
  2. If I Have One Million
  3. C++11多线程:thread头文件
  4. 抖音企业号,抖音搜索框SEO优化系统搭建。
  5. 【深度学习基础】02梯度下降算法改进:SGD、Momentum、NAG、RMSProp、Adam等
  6. 1023: 大小写转换 ZZULIOJ
  7. 基于Excel的VDS记录数据文件查看及转换工具(转MDA格式)
  8. 前端项目review之修改element-ui全局主题颜色配置element-theme-chalk和gulp
  9. 鏖战2021年618
  10. 玩转全志F1C200s 烧录 flash 镜像