CSAPP之实验一:位操作(Datalab)

写在前面:对于想要入门csapp的人最好边看书边做实验,看书的时间不需要太多,主要有个大概的概念就行,通过做实验再慢慢理解,切记做实验的时候别只为了通过系统的测试而且改参数,而应该先分析,然后提取出大致思路后再开始着手改错。

实验环境

我是在windows10下的vscode编辑(因为比较熟悉这款软件),然后在搭建的服务器上测试,利用xshell和xftp工具进行文件传输和指令测试。

为什么不在vmware上呢?因为我感觉我比较菜,解决了这个问题很久,有网络问题,有编译器问题。所以索性就直接用我之前花了10块钱买的服务器来玩。

为什么不在docker虚拟化环境下做呢?因为在这个环境下不能用自己的vscode,而且每次做了一半的实验保存起来有点麻烦,主要我是有一次完成了几个小实验,然后不小心点了关闭窗口,然后。。。。数据就不见了,好像很难找回了,所以我就放弃了,docker虚拟化感觉比较适合在线上服务器中的搭建,而且只适合一次性编程。

实验要求

csapp位操作要求

实验内容

//1
/* 
 * bitXor - x^y using only ~ and & 
 *   Example: bitXor(4, 5) = 1
 *   Legal ops: ~ &
 *   Max ops: 14
 *   Rating: 1
 */
//思路:求异或的非与表达式。逆方向来求解,异或是不同为一,那我们先求他们相同项,最后取反。
// 把1相同项找出来,再把0相同项找出来,然后分别取反再与起来
int bitXor(int x, int y) {
   
  return ~(x&y)&~(~x&~y);
}
/* 
 * tmin - return minimum two's complement integer 
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 4
 *   Rating: 1
 */
// 思路:求0xffffffff,利用算术左移会根据符号位进行补位
int tmin(void) {
   
  return 0x1<<31;

}
//2
/*
 * isTmax - returns 1 if x is the maximum, two's complement number,
 *     and 0 otherwise 
 *   Legal ops: ! ~ & ^ | +
 *   Max ops: 10
 *   Rating: 1
 */
// 思路:求是否为补码最大值0x7fffffff,利用取反和加一一样的特质,除了最小值一样
int isTmax(int x) {
   
  return !((x+1)^(~x))&!!((x+1));
}
/* 
 * 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,利用半掩码来算
int allOddBits(int x) {
   
  int i = 0xaa + (0xaa<<8);
  i += i<<16;
  return !((x&i)^i);
}
/* 
 * negate - return -x 
 *   Example: negate(1) = -1.
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 5
 *   Rating: 2
 */
// 思路:如何实现取相反数运算,即如何去补码。
int neg
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值