The CS:APP Data Lab

这篇博客介绍了CSAPP(计算机系统:应用)数据实验室的内容,涉及整数和浮点数的位操作问题,包括异或、最小值、最大值判断、奇数位检查等挑战。作者分享了解题过程和一些技巧,强调了位操作基础知识的重要性。
摘要由CSDN通过智能技术生成

The CS:APP Data Lab

  • insorker
  • 2021/6/9

Hello

辞退了一些事情,现在成了无业游民,不过终是于闲下来了。也算一个新的开始,有点自己的时间做点喜欢的事情了

所以,你好,CSAPP!

Introduction

第一章的 Lab 是关于整数、浮点数在计算机内部的存储与计算。

虽然数据存储是一件很基础、很自然的事情,大部分时候我们甚至感觉不到它们的存在,因为被认为是理所应当(点名批评弱类型语言)。不过这些仍然很重要,数学计算的错误是非常严重的,可能会带来灾难性的后果,这里引用原文的例子:

哎,没举例呢,想看自己买一本实体书吧~

提前约定一下,大写字母表示单个比特位,小写字母表示一串比特数据

Problems

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;
}

很遗憾,我查了很多地方都没有找到符号 ^ 的正确转义(https://www.onemathematicalcat.org/MathJaxDocumentation/TeXSyntax.htm),有人知道的话务必留言告诉我

首先理解一下异或是什么
A 异 或 B = A ‾ B + B ‾ A A 异或 B = \overline{A}B + \overline{B}A AB=AB+BA
取反和与题目是允许使用的,那么唯一的难点是如何创造出或

根据摩根定律我们可以把 & 和 | 相互转换得到

A | B = ~((~A) & (~B))

所以,可得最终结果

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

2. tmin

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

这题很简单啊,不解释

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;
}

错误示范:

  1. ! (x + x + 2) :x = -1时候不行
  2. !(x ^ ~(x + 1)):同理 x = -1 时候不行

除了错误示范,经过我的测试,还存在很多匪夷所思的地方,比如

int main() {
   
    int a;
    scanf("%d", &a);
    // 0x7FFFFFFF
    printf("%d\n", !!(a + 1));
    printf("%d\n", (a + 1) + (a + 1));
    printf("%d\n", 0x7FFFFFFF);
    printf("%d\n", a);					// <- 在这里
    printf("%d\n", (a + 1));
    printf("%d\n", !!(a + 1) & !(a + a + 2));
    printf("%d\n", isTmax(a));
    return 0;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值