首页 > 其他分享 >CSAPP DataLab学习笔记

CSAPP DataLab学习笔记

时间:2023-07-11 21:01:39浏览次数:57  
标签:Rating CSAPP return ops int DataLab 笔记 allOddBits Legal

1. bitXor

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

  return 2;
}

思路

将异或的真值表写出来,再用 & | ~ 表示,最后化简

代码

int bitXor(int x, int y) {
  /*
  int exp1 = ~(x & ~y);
  int exp2 = ~(~x & y);
  int res = ~(exp1 & exp2);
  */

  return ~((~x)&(~y))&(~(x&y));
}

2.tmin

/* 
 * tmin - return minimum two's complement integer 
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 4
 *   Rating: 1
 */
int tmin(void) {
  return 2;
}

思路

返回二进制补码的最小值,即0x80000000,使用左移操作即可

代码

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

3.isTmax

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

思路

如果x是二进制补码的最大值0x7fffffff,返回1,否则返回0.
我的思路是将x进行运算,如果是0x7fffffff,运算结果会是一个特殊值,比如全0,而其他数进行运算则不是全0,最后取非。
想到了0x7fffffff + 0x7fffffff + 1 = 0xffffffff,按位取反后为0x0.
但一直有bug调试不出来,调试结果如下:

printf("%x %x %d %d\n", x, x + x + 1, (!(~(x + x + 1))), ~(x + x + 1));

输出:
7fffffff ffffffff 0 0
取了非和没取非的值居然相同
最后参考了这篇博客

代码

int isTmax(int x) {
  //printf("%x\n", !(~(0x7fffffff + 0x7fffffff + 1)));
  //printf("%x %x %x\n", x, 0x7fffffff, !!~(x+x+1));
  //printf("%x %x %d %d\n", x, x + x + 1, (!(~(x + x + 1))), ~(x + x + 1));
  int i = x + 1;
  int j = x ^ i;
  int k = ~j;
  return !(k + !i);
}

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
 */
int allOddBits(int x) {                                                      
  return 2;
} 

思路

如果x的所有奇数位都为1则返回1,否则返回0
先构造一个A8 = 0xAAAAAAAA作为掩模,再和x进行与运算,将无关的偶数位置0
将结果和A8异或,若奇数位全为1,结果将为全0,取个非即答案

代码

/* 
 * 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
 */
int allOddBits(int x) {
  int AA = 0xAA;                                                               
  int A4 = (AA << 8) + AA;                                                       
  int A8 = (A4 << 16) + A4;                                                         
  return !((x & A8) ^ A8);                                                          
} 

5. negate

/* 
 * negate - return -x 
 *   Example: negate(1) = -1.
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 5
 *   Rating: 2
 */
int negate(int x) {
  return 2;
}

思路

返回相反数,即返回-x的补码,取反加一即可

代码

/* 
 * negate - return -x 
 *   Example: negate(1) = -1.
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 5
 *   Rating: 2
 */
int negate(int x) {
  return ~x + 1;
}

标签:Rating,CSAPP,return,ops,int,DataLab,笔记,allOddBits,Legal
From: https://www.cnblogs.com/ying-hua/p/17545909.html

相关文章

  • es笔记四之中文分词插件安装与使用
    本文首发于公众号:Hunter后端原文链接:es笔记四之中文分词插件安装与使用前面我们介绍的操作及演示都是基于英语单词的分词,但我们大部分使用的肯定都是中文,所以如果需要使用分词的操作肯定也是需要使用中分分词。这里我们介绍一下如何安装中文分词插件。在介绍安装之前,我们可......
  • 我们与高效工作流的距离:使用AI阅读工具ChatDOC+笔记软件Obsidian Slide,直接从 PDF 文
    我们与高效工作流的距离在当今信息化的时代,为了实现高效工作和学习,如何实现快速地输入和输出成为每个人的必修课题。然而,对于输入而言,每一天大量的信息,往往会使我们陷入信息过载和知识爆炸的困境,难以高效处理。与此同时,输出方面的问题也同样令人头痛。对于多数人而言,PPT是主流......
  • 【做题笔记】线性dp——线段树优化
    线段树优化是用来对于\(DP\)数组区间赋值的。主要是区间取最值来优化线性dp真没什么可写的了挂两个题目:P4644[USACO05DEC]CleaningShiftsSP1545[USACO04DEC]DividingthePathGUSACO的小清新线段树优化dp好题......
  • 我们与高效工作流的距离:使用AI阅读工具ChatDOC+笔记软件Obsidian Slide,直接从 PDF 文
    我们与高效工作流的距离在当今信息化的时代,为了实现高效工作和学习,如何实现快速地输入和输出成为每个人的必修课题。然而,对于输入而言,每一天大量的信息,往往会使我们陷入信息过载和知识爆炸的困境,难以高效处理。与此同时,输出方面的问题也同样令人头痛。对于多数人而言,PPT是主流的输......
  • <<代码整洁之道>> 读书笔记(1-4)
    整洁代码人工智能永远不能完全取代程序员,因为客户的需求总是模糊的,程序员不只是写代码,也会去讨论/设计需求和架构糟糕的代码会杀死项目,通常会在项目中后期体现出来,此时项目的生产力快速下降,影响正常迭代和问题修复对一个成熟的项目进行重新设计和编写,往往会分散......
  • 【C++学习笔记——前置声明:解决嵌套引用问题】
    在代码中,两个类相互引用的问题,那么我们就需要在头文件中相互写#include,这样会造成相互循环cpoy头文件,编译器报错,为了解决这个问题,设置了前置声明这个方法。A.h#ifndefA_H#defineA_HclassBclassA{typedefvector<string>::sizetypesize_type;B*b;}#endifB.h#if......
  • 【ChernoC++笔记】移动赋值运算符
    【90】【ChernoC++】【中字】stdmove与移动赋值操作符▶️移动构造与std::move接上节的String类,我们可以通过string来构造新的对象dest://拷贝构造Stringstring="Hello";Stringdest=string;为了使用移动构造函数,string需要cast为临时变量://移动构造Stringdest=(s......
  • 01.法律笔记
    基础概念:网络安全,是指通过采取必要措施,防范对网络的攻击、侵入、干扰、破坏和非法使用以及意外事故,使网络处于稳定可靠运行的状态,以及保障网络数据的完整性、保密性、可用性的能力。---《中华人民共和国网络安全法》网络运营者,是指网络的所有者、管理者和网络服务提供者。---......
  • redis初识笔记
    1.连接redis:在redis的某个节点机器上cd到redis_cluster目录,执行./redis-cli-h10.174.65.236 -c-p6381 2.查看所有key:keys*3.查看某个key的命令A.普通key:getkeynameB.map类似的keyHGETALLmapname[二级keyname]......
  • HIVE sql 初识笔记
    一、sql1.向hive里的某张表添加数据loaddatalocalinpath'/home/ocdp/hfb/sex.txt'OVERWRITEintotableTD_NP_ENUM_COC_BATCH1_DAY_COLUMN_013;2.查询select*fromTD_NP_ENUM_COC_BATCH1_DAY_COLUMN_013ast;3.清空表truncatetableTD_NP_ENUM_COC_BATCH1_DAY_C......