Csapp整数浮点数操作实验(精讲)

a. int conditional(int x, int y, int z)

  • 功能:实现与三目运算符表达式 x ? y : z 具有等价功能的函数
  • 合法的运算符:! ~ & ^ | + << >>
  • 可使用的运算符数:16
  • 难度:4
  • 寻找一种转换,使得当x非0时转变为0xFFFFFFFF,当x为0时不变。
    int conditional(int x, int y, int z) {//x不为0时结果为y,为0时结果为z.int test1,test2,test3;test1=(!!x);test1=(test1<<31)>>31; //获得!!x的值填充32位。test2=!x;test2=(test2<<31)>>31; //获得!x的值填充32位。test3=(test1&y)+(test2&z); //分别和y,z进行与运算即可得出结果。return test3;
    }

 b.int isNonNegative(int x)

  • 功能:当 x > y 时,返回1,否则返回0
  • 合法的运算符:! ~ & ^ | + << >>
  • 可使用的运算符数:24
  • 难度:3

功能:当 x >=0 时,返回1;否则返回0
判断符号位即可

int isNonNegative(int x) {//判断x的符号位int test1=x>>31;//为0xFFFFFFFF则要return0,为0x00000000要return1.test1=!test1; //使用!将其变为0与1.return test1;
}

c. int isGreater(int x, int y)

  • 功能:当 x > y 时,返回1,否则返回0
  • 合法的运算符:! ~ & ^ | + << >>
  • 可使用的运算符数:24
  • 难度:3

功能:当 x > y 时,返回1,否则返回0
可能有溢出的情况,所以将x和y分为同号和异号两种情况进行考虑
正 - 正 ——不会溢出,返回x-y-1符号位的取反即可(减1是为了排除相等的情况)
正 - 负 —— 函数必须 return 1
负 - 正 —— 函数必须 return 0,可以看到,异号状态返回值为y的符号位。
负 - 负——不会溢出,返回x-y-1符号位的取反即可(同理)

int isGreater(int x, int y) {//需要判断x与y同号和x与y异号的情况。int equalval=x^y;        //判断x与y相等及符号位是否相同。int subval=x+(~(y+1)+1); //计算x-y-1;int result=(((~subval)&(~equalval))+(y&equalval))>>31;//分别计算同号与异号的情况。//并取符号位。前一个为同号,后一个为异号result=result&0x01;return result;
}

d. int absVal(int x)

  • 功能:计算x的绝对值
  • 合法的运算符:! ~ & ^ | + << >>
  • 可使用的运算符数:10
  • 难度:4

功能:计算x的绝对值
同样也是分为x为正和负两种情况考虑
若x为正数,则直接返回x
若x为负数,则返回~x+1

int absVal(int x) {//x为正则返回x, x为负,则返回~x+1;int result,signbit;signbit=x>>31;//获得signbit扩充到32位的01序列,为00...00(x为正数) 或 11...11(x为负数)result=((~signbit)&x)+(signbit&(~x+1));//利用符号位计算结果。//若x为正数,则后半段为0,前半段为x//若x为负数,则前半段为0,后半段为~x+1return result;
}

e.int isPower2(int x)

  • 功能:判断x是否恰好等于 $2^n$,如果等于则返回1,否则返回0
  • 提示:负数必然不是$2^n$
  • 示例:isPower2(5) = 0, isPower2(8) = 1, isPower2(0) = 0
  • 合法的运算符:! ~ & ^ | + << >>
  • 可使用的运算符数:20
  • 难度:4 

功能:判断x是否恰好等于 2^n,如果等于则返回1,否则返回0
考查2^n的位的性质
若 x为 2^n,则 x&(x-1)=0
假设 x为 2^5, 则 x=100000,x-1=011111。显然 x&(x-1)=0
但还需排除负数(即只有符号位为1的情况)和 0 的干扰
等价于判断 x>0
和上一个isGreater 函数方法类似,需要考虑 x<0时溢出的情况,所以分为x>=0和x<0两种情况。

int isPower2(int x) {//首先2的幂有x&(x-1)为0的特征,然后只要判断x大于0(和isGreater判断方法一致)int signbit=(x>>31)&0x01;int signbit2=((x+~0x00)>>31)&0x01;int abzero=signbit+(signbit2&(~signbit));//判断是否大于0,大于0为0,否则为1int nature=x&(x+~0x00);       //性质符合为0int result=abzero+nature;//两者都满足的情况下为0,其他情况都不为0.return !result;
}

 

这段代码的作用是判断一个整数 x 是否为2的幂。
让我们逐步解释代码:

1.int signbit=(x>>31)&0x01;:这行代码提取了 x 的符号位,如果 x 是非负数,signbit 将为0;如果 x 是负数,signbit 将为1。
2.int signbit2=((x+~0x00)>>31)&0x01;:这行代码将 x 加上 -1(即取反加一),然后提取了结果的符号位,实现了一种获取 x 是否大于0 的方式。
3.int abzero=signbit+(signbit2&(~signbit));:这行代码根据 abzero 的定义判断 x 是否大于0。如果 x 大于0,则 abzero 为0,否则为1。
4.int nature=x&(x+~0x00);:这行代码计算了 x 与 x - 1 的按位与,如果 x 是2的幂,其结果将为0。
5.int result = abzero + nature;:这行代码将 abzero 和 nature 相加,如果 x 同时满足大于0且符合2的幂的性质,则 result 为0,否则不为0。
6.return !result;:最后,函数返回 !result,即如果 x 是2的幂,则返回1(真),否则返回0(假)。

f. unsigned float_neg(unsigned uf)

  • 功能:求浮点数f的相反数
  • 说明:参数uf为浮点数f为在计算机中的二进制编码所对应的无符号数。返回值为浮点数-f在计算机中的二进编码所对应的无符号数。
  • 合法的运算符:全部有符号数和无符号数的运算符、||、&&、if 和 while
  • 注意:如果输入为NaN,则返回值等于uf
  • 可使用的运算符数:10
  • 难度:2

功能:求浮点数f的相反数
说明:参数uf为浮点数f为在计算机中的二进制编码所对应的无符号数。返回值为浮点数f在计算机中的 二进编码所对应的无符号数。
合法的运算符:全部有符号数和无符号数的运算符、||、&&、if 和 while
注意:如果输入为NaN,则返回值等于uf
可使用的运算符数:10
难度:2

如题目要求,分为NaN情况和一般情况
NaN情况 :判断出来后,直接返回 uf 的值
NaN:即阶码位全为1,小数位不全为 0时为NaN
一般情况:根据 IEEE 754 原则,将 float 阶码位 ^ 1, 然后返回。

unsigned float_neg(unsigned uf) {//分为NAN和规范数两种情况。unsigned result;int elsign=uf&0x7fffffff;    //排除符号位影响。int exp=elsign>>23;          //获得阶码位if((!(exp^0xff))&&(elsign^0x7f800000))//前一个判断阶码位是否全为1//后一个在前一个基础上判断小数字段是否不全为0return uf;result=uf^0x80000000;return result;
}

 g. unsigned float_i2f(int x)

  • 功能:返回浮点数(float)x在计算机中的二进制编码所对应的无符号数
  • 合法的运算符:全部有符号数和无符号数的运算符、||、&&、if 和 while
  • 可使用的运算符数:30
  • 难度:4

功能:返回浮点数(float)x在计算机中的二进制编码所对应的无符号数
即把 x 转换为 浮点数类型对应的无符号数字
就是把(float)x的位表示放在一个无符号变量中返回

根据IEEE 754原则和向偶取整原则一步一步进行实现

IEEE 754 中 float x=(-1)^signbit * 2^(exp-Bias)(1+frac)
例:float f=15213.0 ,其二进制值为0011 1011 0110 1101. 在IEEE 754中
其位表示为:(-1)^0 * (1.1101101101101) * 2^13
exp=13+bias(在float中为127)=1000 1100(二进制)
frac=1101101101101…0(小数去掉1,共23位)
s=0

向偶舍入:(四舍六入五成双)
即规定的位后面>100,则进1
若<100,则舍去
若等于100,若此位为1,则进1;此位为0,则舍去。

unsigned float_i2f(int x) {//即将x变为float型。按照IEEE和向偶取整的规则即可。int signbit,highbit,exp,fracbits,flag;unsigned temp,result;if(!x)return x;             //由于规范数情况不包含0,所以先处理0情况。signbit=(x>>31)&0x01;if(signbit)x=~x+1;              //获得符号位,并将x变为正值。highbit=0;temp=x;while(!(temp&0x80000000)){temp<<=1;highbit++;}                    //获得x的最高有效位,即确定fraction的位数。temp=temp<<1;exp=127+31-highbit;  //根据单精度浮点数规则计算出exp,和fraction位数。fracbits=31-highbit;flag=0;               //进行向偶舍入if((temp&0x1ff)>0x100)flag=1;              //出现在规定位置后大于0b100的情况就进1.if((temp&0x3ff)==0x300)flag=1;              //出现最后一位为1,且下一位为1的情况也进1(向偶取整)result=(signbit<<31)+(exp<<23)+(temp>>9)+flag;//计算最终结果return result;
}

至此,完结撒花!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/816046.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速入门深度学习9.1(用时20min)——GRU

速通《动手学深度学习》9.1 写在最前面九、现代循环神经网络9.1 门控循环单元&#xff08;GRU&#xff09;9.1.1. 门控隐状态9.1.1.1. 重置门和更新门9.1.1.2. 候选隐状态9.1.1.3. 隐状态 9.1.3 API简洁实现小结 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 20…

空指针与野指针的辨析

空指针 空指针不指向任何实际的对象或者函数&#xff0c;反过来&#xff0c;任何的对象或者函数也不可能是空指针。 在程序中得到空指针的办法就是使用预定义的NULL&#xff0c; int *ip NULL; 校验一个指针是否为空指针可以用 if (ip NULL) NULL是标准规定的宏定义&am…

h5 笔记4 表格与表单

<table></table>设置表格&#xff1b; <tr></tr>设置行数&#xff1b; <td></td>设置列数&#xff1b; <caption></caption>设置表格标题&#xff1b; <th></th>设置列标题。 直列&#xff1a;column&#xf…

独孤思维:完美的赚钱人设,一定是假的

01 做个人ip&#xff0c;设立自己的人设。 不要完美无缺。 完美100%是假的。 都是人&#xff0c;谁没个缺点。 不要把自己架得太高&#xff0c;搞得事事完美。 这是不合理的。 粉丝看了&#xff0c;会觉得很假。 一定要真实。 哪怕你有这样的缺点&#xff0c;那样的毛…

Pytest精通指南(09)利用Fixture给函数设置别名

文章目录 前言测试用例默认显示传递一个参数传递多个参数 利用Fixture修改测试函数名称传递一个参数传递多个参数 验证ids和params长度不一致修改Fixture函数名称 前言 在 pytest 中&#xff0c;pytest.fixture 装饰器用于定义可以在多个测试函数中重用的设置和清理代码。 name…

android gradle 配置远程仓库

build.gradle buildscript { ext.kotlin_version "1.6.0" // 使用适合你项目的Kotlin版本 repositories { maven { url http://maven.aliyun.com/nexus/content/groups/public/ } maven { url http://maven.aliyun.com/nexus/content/repos…

虚拟机下CentOS7开启SSH连接

虚拟机下CentOS7开启SSH连接 自己在VMware中装了CentOS 6.3&#xff0c;然后主机&#xff08;或者说xshell&#xff09;与里面的虚拟机连不通&#xff0c;刚学习&#xff0c;一头雾水&#xff0c;查了半天&#xff0c;也不知道怎么弄。 在虚拟机&#xff08;Vmware Workstatio…

OSCP靶场--PayDay

OSCP靶场–PayDay 考点(公共exp文件上传密码复用sudo -l all提权) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC 192.168.153.39 -p- -Pn --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-13 04:52 EDT Nmap scan report for 192…

C语言 | 字符函数和字符串函数

目录&#xff1a; 1. 字符分类函数 2. 字符转换函数 3. strlen的使用和模拟实现 4. strcpy的使用和模拟实现 5. strcat的使用和模拟实现 6. strcmp的使用和模拟实现 7. strncpy函数的使用 8. strncat函数的使用 9. strncmp函数的使用 10. strstr的使用 11. strtok函…

智慧公厕:城市管理的一大创新

公共厕所作为城市基础设施的重要组成部分&#xff0c;不仅仅是提供方便的厕所&#xff0c;更是城市管理的一项创新。随着科技的发展&#xff0c;智慧公厕应运而生。通过物联网、大数据、云计算、网络通信、自动化控制等技术&#xff0c;智慧公厕实现了对公厕内部人体活动状态、…

【算法刷题day22】Leetcode:235. 二叉搜索树的最近公共祖先、701. 二叉搜索树中的插入操作、450. 删除二叉搜索树中的节点

文章目录 Leetcode 235. 二叉搜索树的最近公共祖先解题思路代码总结 Leetcode 701. 二叉搜索树中的插入操作解题思路代码总结 Leetcode 450. 删除二叉搜索树中的节点解题思路代码总结 草稿图网站 java的Deque Leetcode 235. 二叉搜索树的最近公共祖先 题目&#xff1a;235. 二…

JD抓包 | 安卓app抓包

去年11月份左右搞过一次安卓抓包, 搞了很久试了很多方法, 才弄好. 时隔半年, 安卓抓包依然是令我头疼的问题 这次简单记录一下过程(细节太多我也说不清) JD的有效信息接口通常是以下这样的, 其他的接口并没有返回太多"有用"的信息 https://api.m.jd.com/client.act…

Composite 组合

意图 将对象组合成树形结构以表示“部分-整体”的层级结构。Composite使得用户对单个对象和组合对象的使用具有一致性。 结构 其中&#xff1a; Component为组合中的对象声明接口&#xff1b;在适当情况下实现所有类共有接口的默认行为&#xff1b;声明一个接口用于访问和管…

Java基础(二)-- 面向对象

文章目录 第二章、面向对象一、类和对象1、基本概念1&#xff09;什么是对象2&#xff09;什么是面向对象3&#xff09;什么是类4&#xff09;什么是对象的属性和方法5&#xff09;类和对象的关系 2、单一职责原则3、对象实例化1&#xff09;Java内存管理之堆和栈 4、构造方法5…

LeetCode题练习与总结:有效数字--65

一、题目描述 有效数字&#xff08;按顺序&#xff09;可以分成以下几个部分&#xff1a; 1. 一个 小数 或者 整数 2. &#xff08;可选&#xff09;一个 e 或 E &#xff0c;后面跟着一个 整数 小数&#xff08;按顺序&#xff09;可以分成以下几个部分&#xff1a; 1. &…

串及BF算法

一.串的相关定义 1.字符串的拷贝,比较,链接等等(C语言) 2 串:用 引起来的字符序列,例如abcd (区别字符串"abcd") 3.空串: (区别字符串"") 4.子串:包含空串和本身,abc的子串:,a,b,c,ab,bc,abc7个 5.真子串:包含空串,不包含本身,abc的子串:,a,b,c,a…

自动驾驶仿真测试的难点

自动驾驶仿真测试是自动驾驶车辆商业化落地的一道重要关卡&#xff0c;仿真测试技术的发展进步将决定自动驾驶落地的时间点。 仿真测试对自动驾驶的重要性不言而喻&#xff0c;笔者写这些内容希望能够抛转引玉。更希望能够作为一个“呐喊者”让更多的人去关注和重视自动驾驶仿…

一条命令把视频和字幕合并成一个文件

ffmpeg -i input_video.mp4 -i input_subtitles.ass -c:s mov_text -c:v copy -map 0:v -map 0:a -map 1:s output_video.mp4 参数说明&#xff1a; -i input_video.mp4 指定输入视频文件。 -i input_subtitles.ass 指定输入的字幕文件。 -c:s mov_text 指定字幕编码器为mov…

【LeetCode: 705. 设计哈希集合 + 数据结构设计】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Qt快速入门(MV架构之TableView + QStandardItemModel + 自定义代理小案例)

Qt快速入门&#xff08;MV架构之TableView QStandardItemModel 自定义代理小案例&#xff09; 关于MV架构的简单介绍 在Qt框架中&#xff0c;代理&#xff08;Delegate&#xff09;、模型&#xff08;Model&#xff09;和视图&#xff08;View&#xff09;之间的关系构成了…