CSAPP实验--DataLab函数实现

目录

前言 

 一、前期准备

二、函数实现

        1.bitXor

        2.tmin

        3.isTmax

        4.allOddBits

        5.negate

        6.isAsciiDigit

        7.conditional

        8.isLessOrEqual

        9.logicalNeg

        10.howManyBits

        11.floatScale2

        12.floatFloat2Int

        13.floatPower2 

三、小结


前言

该实验为《深入了解计算机系统》即CSAPP的第一个实验:DataLab,旨在通过位级运算实现一些功能。本文介绍开始实验前需要进行的准备工作以及每个函数具体的实现方式。

一、前期准备

1.需要在linux系统上运行,因此无论是在电脑上装一个linux系统或是使用虚拟机,设法取得一个linux系统,推荐使用虚拟机。

2.推荐使用Vscode编辑器,功能强大。 

3.实验内容下载地址: http://csapp.cs.cmu.edu/3e/labs.html 

   注意下载其中的handout即可。

二、函数实现

1.bitXor

bitXor - x^y using only ~ and &

 *   Example: bitXor(4, 5) = 1

 *   Legal ops: ~ &

 *   Max ops: 14

 *   Rating: 1

用 ~ 和 & 实现异或运算。

思路

先将x为0且y为1的位找出:(~x) & y;

再将x为1且y为0的位找出:x & (~y);

最后用或运算 | 相连,但限制使用 | ,因此用~( ~() & ~() )代替。

函数实现

int bitXor(int x, int y) {
  return ~(~((~x) & y) & ~(x & (~y))); 
  //等价于 (~x) & y | x & (~y) |的前者将x为0y为1的位找出,后者将x为1y为0的位找出
}

2.tmin

tmin - return minimum two's complement integer

 *   Legal ops: ! ~ & ^ | + << >>

 *   Max ops: 4

 *   Rating: 1

返回int类型能表示的最小值,即Tmin。

思路

根据补码规则,int的最小值为0x80000000,因此将1左移31位即可。

函数实现 

int tmin(void) {
    return 1 << 31; //int类型有32位,将1左移31位得到最小值负2的32次方
}

3.isTmax

isTmax - returns 1 if x is the maximum, two's complement number,

 *     and 0 otherwise

 *   Legal ops: ! ~ & ^ | +

 *   Max ops: 10

 *   Rating: 1 

如果x为最大值(Tmax)则返回1,否则返回0 。

思路

不难(doge)发现,x为最大值0x7FFFFFFF时,+1后(0x80000000)再取反(0x7FFFFFFF)得到了它本身,而除此(Tmax)之外这个性质仅对于x=-1(0xFFFFFFFF)成立。因此我们想到,先验证x加1取反后与x异或,x为最大值时返回0x00000000=0,取非得到返回值1。同时验证x不等于-1(0xFFFFFFFF),即验证x+1不等于0:x+1与0异或,x=-1时得到0,取非两次得到0.将两种情况进行与运算即可排除x=-1的情况。

函数实现

int isTmax(int x) {
  return !((~(x+1))^x) & (!!((x+1)^0));
}

4.allOddBits

allOddBits - return 1 if all odd-numbered bits in word set to 1

 *   where bits are numbered from 0 (least significant) to 31 (most significant)

 *   Examples allOddBits(0xFFFFFFFD) = 0, allOddBits(0xAAAAAAAA) = 1

 *   Legal ops: ! ~ & ^ | + << >>

 *   Max ops: 12

 *   Rating: 2

如果奇数位全为1(0xAAAAAAAA)则返回1,否则返回0 。

思路

先得到奇数位全为1的数(0xAAAAAAAA),再将x与其比较。

若x满足,x与其与运算后仍为本身,与其异或后为0,取反后为1,返回1;

若x不满足,与运算后存在奇数位为0的位置,异或后这些奇数位为1,取反后为0,返回0.

函数实现

int allOddBits(int x) {
  int a_8=0xAA;
  int a_16=a_8 | (a_8<<8);
  int a_32=a_16 | (a_16<<16); // 获得一个三十二位的奇数位全为1的数
  return !((x & a_32)^ a_32);
}

 5.negate

negate - return -x

 *   Example: negate(1) = -1.

 *   Legal ops: ! ~ & ^ | + << >>

 *   Max ops: 5

 *   Rating: 2

输出相反数 -x 。 

思路

取反再加1即可。

函数实现 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值