csapp lab环境搭建及lab1wp

一.环境搭建

**

首先要搞一个ubantu的虚拟机,具体自行百度
搞好虚拟机开始搭建环境,右键打开终端,然后输入以下指令

apt-get update    //更新apt软件源
apt-get install sudo   //安装sudo
sudo apt-get install build-essential  //安装c/c++编译环境
sudo apt-get install gcc-multilib  //补充gcc的完整环境(gcc-multilib)
sudo apt-get install gdb  //安装gdb
sudo apt-get install make  //安装make

如何做题及如何检查对错,输入以下指令(以第一道题bitXor为例)

make btest
./btest -f bitXor
./btest -g //总览所有题的得分

在这里插入图片描述
得满分就说明做对了
**

二.lab1wp

int规则(百度翻译的,应该能看懂)

整数常量0到255(0xFF),包括在内。
不允许使用大常量,例如0xffffffff。
明确禁止您:

1.使用任何控件构造,例如if、do、while、for、switch等。

2.定义或使用任何宏。

3.在此文件中定义任何附加功能。

4.调用任何函数。

5.使用任何其他操作,如&&、| |、-、or、?:

6.使用任何形式的铸造。

7.使用int以外的任何数据类型。这意味着
无法使用数组、结构或联合。

1.bitxor

//1
/* 
 * bitXor - x^y using only ~ and & 
 *   Example: bitXor(4, 5) = 1
 *   Legal ops: ~ &
 *   Max ops: 14
 *   Rating: 1
 */

题意就是用~、&来实现异或
~:对于二进制的每一位,将1变为0,将0变为1

对于x,y,只能有两种&组合,x&y和~x & ~y,如果是 ~x&y,或者是 ~y&x,都是行不通,要么都取反,要么都不取
这里就用4,5来尝试一下,4&5=0100,~4 & ~5=1010
这下就是进行不断尝试组合,出答案

int bitXor(int x, int y) {
   
    return ~(x & y)&~(~x&~y);
}

2.tmin

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

题意是求二进制补码的最小值,0x10000000是最小值,但是只能输入0到255(0xFF)之间的,所以要用到左移<<,具体如下:

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

3.isTmax

//2
/*
 * isTmax - returns 1 if x is the maximum, two's complement number,
 *     and 0 otherwise 
 *   Legal ops: ! ~ & ^ | +
 *   Max ops: 10
 *   Rating: 1
 */

题意是如果接受的x为二进制最大值,就返回1,否则为0
二进制最大值为0x7FFF FFFF,假设它就是x,则x+1就是0x8000 0000,这个时候将二者异或就得到了0xFFFF FFFF,再加一个 ‘~’ ,就得到了0,最后return时再用逻辑非即可。但是0xFFFF FFFF与其+1异或后也是0xFFFF FFFF,这个时候再对其+1的数两次 ‘!’,为0,结合一下进行与运算
具体实现如下:

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

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时,返回1。
满足所有奇数位为1的数只有0xAAAA AAAA和0xFFFF FFFF,这个时候就要用到异或来判断了
首先假设x是0xAAAA AAAA,要弄出一个与x异或的值0xAAAA AAAA,这样使其为0后,再用逻辑非变成1,
如果x为0xFFFF FFFF ,这里需要再多加一条与运算,使其先变为0xAAAA AAAA再异或就得到0了
现在还有一个问题就是0xAAAA AAAA怎么给变量赋上值,这里就要用到逻辑左移和异或结合得到
具体如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值