《CSAPP》(第3版)答案(第二章)(一)

2023-11-05

《CSAPP》答案(第二章)(一)

P55

#include <stdio.h>
typedef unsigned char* byte_pointer;
void show_bytes(byte_pointer start,size_t len){
    size_t i;
        for(i=0;i<len;i++){
            printf("%.2x",start[i]);
          }
   printf("\n");
   }
int main(){
    int num = 114514;    
    show_bytes((byte_pointer)&num,sizeof(int));
    }

P56

#include <stdio.h>

typedef unsigned char* byte_pointer;

void show_bytes(byte_pointer start,size_t len){
    size_t i;
    for(i=0;i<len;i++){
        printf("%.2x",start[i]);
    }
    printf("\n");
}
int main(){
    int num = 1919810;
    show_bytes((byte_pointer)&num,sizeof(int));
}

P57

#include <stdio.h>
typedef unsigned char* byte_pointer;
void show_bytes(byte_pointer start,size_t len){
    size_t i;
    for(i=0;i<len;i++){
        printf("%.2x",start[i]);
    }
    printf("\n");
}
void show_short(short x){
    show_bytes((byte_pointer)&x,sizeof(short));
}
void show_long(long x){
    show_bytes((byte_pointer)&x,sizeof(long));
}
void show_double(double x){
    show_bytes((byte_pointer)&x,sizeof(double));
}
int main(){
    double num = 114514.1919810;
    short nums = (short)num;
    short num1 = (long)num;
    double numd = (double)num;
    show_bytes((byte_pointer)&num,sizeof(int));
    show_short(num);
    show_long(num);
}

P58

#include <stdio.h>
typedef unsigned char* byte_pointer;
int is_little_endian(){
    int test = 0x11;
    byte_pointer p = (byte_pointer)& test;
    if(p[0]==0x11)
        return 1;
    else
        return 0;    
}
int main(){
    if(is_little_endian())
        printf("The machine is little endian\n");
    else
        printf("The machine is big endian\n");    
}

P59

#include <stdio.h>
typedef unsigned char* byte_pointer;
size_t numCombine(size_t x,size_t y){
    size_t mask = 0xff;
    size_t result =((x&mask)|(y&~mask));
    return result;
}
int main(){
    size_t x,y;
    scanf("%d",&x);
    scanf("%d",&y);
    printf("%d",numCombine(x,y));  
}

P60

#include <stdio.h>
typedef unsigned char* byte_pointer;
size_t replace_byte(unsigned x,int b,unsigned char plugin){
    size_t mask=((unsigned)0xff)<<(b<<3);
    return (x&(~mask))|(((unsigned)plugin)<<(b<<3));
}
int main(){
    printf("%x\n",replace_byte(0x12345678,0,0xAB));
    printf("%x\n",replace_byte(0x12345678,3,0xAB));
}

P61

  • A.
!~x
  • B.
!x
  • C.
!~(x | ~0xff)
  • D.
!((x >> ((sizeof(int)-1) << 3)) & 0xff)

P62

#include <stdio.h>
int int_shifts_are_arithmetic(){
    int test = -1;
    return !(test^(test>>1));
}
int main(){
    printf("%d",int_shifts_are_arithmetic());
    return 0;
}

P63

#include <stdio.h>
unsigned srl(unsigned x,int k){
    unsigned xsra = (int) x>>k;
    int w = sizeof(int)<<3;
    int mask = (int)-1<<(w-k);
    return xsra&(~mask);
}
int sra(int x,int k){
    int xsrl = (unsigned) x>>k;
    int w = sizeof(int)<<3;
    int mask = (int)-1<<(w-k);
    int mmask = (int)-1<<(w-1);
    mask = mask&(!(mmask&x)-1);
    return xsrl|mask;
}
int main(){
    unsigned testu = 0x12345678;
    int testi = 0x12345678;
    printf("%x\n",srl(testu,2));
    printf("%x\n",sra(testi,2));
}

P64

#include <stdio.h>
int any_odd_one(unsigned x){
    int mask = 0xAAAAAAAA;
    return !(x&mask);
}
int main(){
    int test = 0xAA11;
    printf("%d",any_odd_one(test));
}

P65

#include <stdio.h>
int odd_ones(unsigned x){
    x=x^(x>>16);
    x=x^(x>>8);
    x=x^(x>>4);
    x=x^(x>>2);
    x=x^(x>>1);
    return x&0x1;
}
int main(){
    unsigned test1 = 0x10100001;
    unsigned test2 = 0x00001010;
    printf("%d\n",odd_ones(test1));
    printf("%d\n",odd_ones(test2));
}

P66

#include <stdio.h>
int leftmost_one(unsigned x) {
  x |= x >> 1;
  x |= x >> 2;
  x |= x >> 4;
  x |= x >> 8;
  x |= x >> 16;
  return (x >> 1) + (x && 1);
}
int main() {
  printf("%x\n",leftmost_one(0x6600));
  return 0;
}

P67

  • A
    32位机器最多只能移位31位,否则位“未定义”
  • B
#include <stdio.h>
int int_size_is_32(){
    int set_msb = 1<<31;
    int beyond_msb = set_msb<<1;
    return set_msb && !beyond_msb;
}
  • C
#include <stdio.h>
int int_size_is_32(){
    int set_msb = 1<<1<<4<<5<<1<<4<<1<<1<<4<<5<<1<<4;
    int beyond_msb = set_msb<<1;
    return set_msb && !beyond_msb;
}

P68

#include <stdio.h>
int lower_one_mask(int n){
    int w = sizeof(int)<<3;
    return (unsigned)-1>>(w-n);
}
int main(){
    printf("%x\n",lower_one_mask(17));
}

P69

#include <stdio.h>
unsigned rotate_left(unsigned x,int n){
    int w = sizeof(int)<<3;
    return (x<<n)|(x>>(w-n-1)>>1);
}
int main(){
    printf("%x\n",rotate_left(0x12345678,4));
    printf("%x\n",rotate_left(0x12345678,20));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《CSAPP》(第3版)答案(第二章)(一) 的相关文章

随机推荐

  • 即时AI设计领跑新视界

    Part1前言 随着人工智能技术的不断发展 越来越多的设计师开始关注AIGC Artificial Intelligence Generated Content 并开始思考AIGC对设计师的影响以及如何运用AIGC即时为设计服务 作为全球首
  • 最新RemObjects,您值得拥有

    最近想学习一下分布式等技术 在网上找了一些资料 为了方便俺记了下来 以下转载自 http blog csdn net chinaeband archive 2009 06 19 4282506 aspx http blog csdn net
  • 中南林注册教育邮箱加获取JetBrains个人许可证,续订许可证

    文章目录 1 注册中南林教育邮箱 1 1 注册 1 2 登录 1 3 speech balloon 有话说 2 注册JetBrains个人账号 2 1 进入登录 注册 2 2 查看邮箱信息 2 3 填写基本信息并提交 2 4 注册成功 3
  • 软件测试的艺术

    软件测试 软件测试 是一个过程或一系列过程 用来确认计算机代码完成了其应该完成的功能不执行其不该有的操作 软件应当是可预测且稳定的 不会给用户带来意外惊奇 更准确的说 测试是为发现错误而执行程序的过程 软件测试的重要原则 编号 原则 0 软
  • Java项目---图片服务器

    图片服务器 gt 服务器 图床 核心功能 上传图片 展示图片等 比如 编写博客时我们会插入图片 本质上是往文章中放了一个链接 URL 这个URL资源在另外一个服务器上 核心知识点 1 简单的Web服务器设计开发能力 Servlet Web服
  • Linux编程(获取系统时间)

    include
  • 事务中间件 CICS 原理及应用开发

    https www ibm com developerworks mydeveloperworks blogs cicschina entry cics transaction gateway69 lang en 事务中间件 CICS 原理
  • 转行IT为什么必须学Python?Python的职业发展是什么?

    Python这个词估计听烂了 那么为什么那么多小伙伴都在学Python呢 Python到底有啥魔力 学了Python都能干啥 为什么有必要学python 1 为什么Python适合作为第一个学习的编程语言 Python语言设计的初衷就是容易
  • 神经网络之BP算法【图文并茂】

    神经网络之BP算法 图说神经网络 BP算法理论推导 例子运用 代码 最近在学习 Deep Learning 这本书 书中在前馈神经网络 全连接神经网络以及卷积神经网络等内容中 都有提到反向传播算法 这一算法可以说是神经网络中求解参数比较核心
  • 判断是当前是什么手机和判断是在微信内还是浏览器内

    判断是android还是ios switch uni getSystemInfoSync platform case android console log 运行在安卓手机上 break case ios console log 运行在io
  • web自动化如何区分在不同浏览器运行_Web自动化测试:浏览器不同页签之间的切换(handle)

    一 切换页签 句柄handle 的基础用法 备注 部分方法为老写法 官方已经不推荐使用 点击这篇文章查看切换handle新写法 1 获取浏览器当前所在页签的句柄 current window handle 2 获取所有页面窗口的句柄 win
  • 40. 实战:基于tkinter实现用户UI界面——对34小节的VIP音乐解析系统的全面升级(附源码)

    目录 前言 目的 思路 代码实现 1 首先设计主页UI界面 2 封装核心解析歌曲代码 3 下载音乐到本地 4 将界面居中 禁止修改窗口大小 等待关闭 退出指令 完整源码 运行效果 使用过程 菜单栏 打包的exe 总结 前言 本节将升级34
  • VS2005 VS2010数据断点不能设置的原因 new data breakpoint is disabled

    数据断点是VS的一项犀利功能 尤其在我司这种代码量巨大的大型系统中 想知道一个被很多地方访问的类的变量是在什么时候被改变的是一件很困难的事情 使用数据断点能极大提高debug的效率 可昨天突然遇到了数据断点按钮变灰的情况 无法进行设置 原因
  • P4197 Peaks(主席树+Kruskal重构树+倍增)

    传送门 前缀知识 Kruskal重构树 题面 思路 看到困难值小于等于x就应该想到用Kruskal重构树了 首先我们构建一颗Kruskal重构树 然后询问是问我们从某个点 u u u出发 不超过困难值 h h h 那么这个过程我们可以用倍增
  • easyPoi实现Excel文件上传图片并改变自定义图片上传地址

    使用easypoi遇到的一个上传图片自定义图片地址的问题 解决后就保留一下 您正在使用easypoi进行excel导入图片 并希望可以更改导入后的图片地址 希望这篇文章能帮到您 本文主要是使用easypoi通过模版的形式导入图片 Maven
  • 远控免杀专题(67)-白名单(113个)总结篇

    关于白名单程序 相信大家对白名单程序利用的手法也已经非常熟悉了 白名单程序利用其实是起源于LOLBins 全称 Living Off the Land Binaries 直白翻译为 生活在陆地上的二进制 这个概念最初在2013年DerbyC
  • 2021-08-24

    记录一下在射线碰撞到得物体旁边创建一个颜色盒子UI墙 using System using System Collections using System Collections Generic using System IO using
  • Jupyter Notebook 的使用指南

    前言 Jupyter Notebook是一个开源的Web应用程序 允许用户创建和共享包含代码 方程式 可视化和文本的文档 它的用途包括 数据清理和转换 数值模拟 统计建模 数据可视化 机器学习等等 它具有以下优势 可选择语言 支持超过40种
  • 蓝桥杯——分巧克力

    标题 分巧克力 儿童节那天有K位小朋友到小明家做客 小明拿出了珍藏的巧克力招待小朋友们 小明一共有N块巧克力 其中第i块是Hi x Wi的方格组成的长方形 为了公平起见 小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们 切出的巧克力需
  • 《CSAPP》(第3版)答案(第二章)(一)

    CSAPP 答案 第二章 一 P55 include