西工大网络空间安全学院计算机系统基础实验一(9, 10, 11, 12, 13)

news2024/11/20 10:44:49

还是那句话,专心做好你自己的,老老实实把基础打好,不要被其他人带跑节奏,不要跟他打,跟着这系列博客,稳扎稳打一步一步来。即使你VMware workstation没下载好,即使你Ubuntu虚拟机没配好,即使你不知道怎么使用VS code,即使你不知道怎么检查运算符,即使你不知道怎么核对答案,都没有关系。哪怕他们会用Github,哪怕他们有chatgpt账号,哪怕他们在炫耀什么gnome,都不要害怕。

接着是第9个函数,int isLess(int x, int y),如果x<y,那么就返回1,反之返回0。比如说,因为4小于5,所以isLess(4,5) = 1。那么如何判断x<y呢?我们可以分为一下两种情况:x与y同号,x与y异号。第一种情况,当x与y异号,即当!((x>>31)^(y>>31))的值为0时,只需返回~(x>>31)+1即可,为什么呢?因为如果x为正数,则y为负数,此时x<y是不成立的,应该返回0,而此时x>>31=0x0,~(x>>31)为0xFFFFFFFF,~(x>>31)+1为0x0,正好是应该返回的0,如果x为负数,则y为正数,此时x<y成立,应该返回1,而此时x>>31=0xFFFFFFFF,~(x>>31)为0x0,~(x>>31)+1为0x1,正好是应该返回的1。所以针对第一种情况,我们写出表达式"return ~(x>>31)+1"。而第二种情况,x与y同号,即当!((x>>31)^(y>>31))的值为1时,此时可以使用x-y,如果x<y的话,x-y<0,即x-y的最高位也就是符号位为1(因为只允许使用int型变量,而int型变量采取的形式是二进制补码形式,最高位即为符号位)。那么如何计算x-y呢?毕竟不允许使用-运算符,而根据加法与减法的关系,可以知道x-y=x+~y+1。所以如果((x+~y+1)>>31)&0x1为1,就说明(x+~y+1)>>31为0xFFFFFFFF,进而说明(x+~y+1)的最高位为1(因为右移是算术右移),进而说明x-y是负数,进而说明x<y。所以针对于第二种情况,我们写出表达式"return ((x+~y+1)>>31)&0x1;"。综合上述两种情况,我们该返回什么呢?先设置第一种情况的返回值的表达式为"int ret1=~(x>>31)+1;",接着设置第二种情况的返回值的表达式为"int ret2=((x+~y+1)>>31)&0x1;",而判断该返回ret1还是ret2的表达式为"con=!((x>>31)^(y>>31))"。这下子可以写出"return (con&ret2)|(!con&ret1);"当con为1时,完全可以忽略(!con&ret1),而只选择看(con&ret2),这时返回的是ret2,符合我们的推理。当con为0时,忽略(con&ret2),而只选择看(!con&ret1),此时返回的是ret1,也符合我们的推理。接着仿照与前8个函数同样的步骤,我们写出了第9个函数并验证了它是否满足运算符的要求,以及是否正确,如(图1:第9个函数)所示。

**************************************************************************************************************

 (图1:第9个函数)

**************************************************************************************************************

接着,看第10个函数,int isLessOrEqual(int x, int y),第10题在第9题的基础上,额外要求,如果x=y,也需要返回1。那么我们在我们做出的第9题的答案的基础上,具体分析看一看是否满足第10题提出的额外的这个条件。首先因为x=y,所以x与y一定是同号,属于第9题中的第二种情况,而第9题中的第2种情况计算了x-y,即计算了x+~y+1。当x=y=0x9FFF FFFF(随便举个例子,为了方便理解)时,~y=0x6000 0000,~y+1=0x6000 0001,x+~y+1=0x0,当 x=y=0x7FFF FFFF时,~y=0x8000 0000,~y+1=0x8000 0001,x+~y+1=0x0,第9题中的ret2的表达式为"((x+~y+1)>>31)&0x1",而此时无论相等的x和y同正还是同负,((x+~y+1)>>31)&0x1都为0,注意!!!我们期望的是,如果x=y,也需要返回1,而不是返回0!!!所以我们还需要再进行额外的判断。当然,当x=y时,x^y=0,其它情况下,x^y均不为0。所以利用这一性质,我们只需要小小的修改return语句的表达式即可,修改为"return (con&(ret2|!(x^y)))|(!con&ret1)",这个修改说明,当con为1,也就是x与y同号时,如果ret2为0,则需要再稍微停留一会儿,再思考一下!(x^y),也就是x与y是否相等。当然,有些同学感觉似乎有点感觉了,但感觉又不是很明显,不用担心,等到了大一下学期学习离散数学时,深入学习集合的知识,你们会明白更多的。仿照第9个函数的剩余步骤,如(图2:第10个函数)所示。

**************************************************************************************************************

(图2:第10个函数)

**************************************************************************************************************

休息一会儿之后,我们来看第11个函数, int trueFiveEighths(int x),其在第6个函数的基础上,额外要求避免溢出。这里的避免溢出是什么意思呢?意思是在第6个函数中,我们给出的表达式还原了C语言表达式x*5/8,虽然5/8是一个小数,只要x是在int的表示范围内,那么x*5/8的最终结果也一定在int的表示范围内。只不过C语言表达式会先计算x*5,在计算/8,“先计算x*5”就引入了溢出的可能,所以我们需要想办法改正这一点。怎么改正呢?把我们编写的第6个函数返回的表达式拿过来,"return (((x<<2)+x)>>3)+((x>>31)&!!(x<<29));",针对其中的(((x<<2)+x)>>3),我们可以将其化简成(x>>1)+(x>>3),这样子都是算术右移,就不会造成溢出了。当然,这只是大体的框架,具体还需要怎样的细调,还需要我们去结合题意修改。通过与自己写的C程序做比对,如(图3:与自己写的C程序做比对)所示,我们发现,对于正数x,当x的最低位字节为5, 7, d, f时,返回值还需要在(x>>1)+(x>>3)的基础上加1,而如何表示正数x且x的最低位字节为5, 7, d, f呢?!(x>>31)&!((x&0x5)^0x5)。而对于负数x,我们发现更加复杂,当x的最低位字节为5, 7, d, f时,返回值还需要额外再加2,如果最低位字节为0或者8,则不需要添加,如果最低位字节为除了57df与08之外的其它,则只需要加1。我们的思路如(图3:第11个函数的思路)所示。当然如果你看不懂这个思路也没有关系,大胆往后做,我会慢慢讲。接着仿照前10个函数的思路,如(图4:第11个函数)所示:

**************************************************************************************************************

(图3:第11个函数的思路)

**************************************************************************************************************

**************************************************************************************************************

(图4:第11个函数)

************************************************************************************************************** 

第12个函数,int parityCheck(int x), 如果x包含奇数个1,那么返回1,反之返回0。拿int型变量a=0x7FFF FFFF举例来说,我们想让其最终返回的结果为1。现在来看,让a的前一半字节与后一半字节做异或操作,即0x7FFF^0xFFFF,得到了0x1000,接着让0x1000的前一半字节与后一半字节做异或操作,即0x10^0x00,得到了0x10,接着0x1^0x0得到了0x1,接着00B与01B做异或操作,得到了01B,接着0B与1B做异或操作,得到了1B,正好是我们想让其最终返回的结果。按照这个思路,我们可以写出相应的代码,并且仿照前11个函数相同的操作,验证我们写出的表达式的正确性,如(图5:第12个函数)所示。另外,第12个函数的代码很简洁,甚至有些匪夷所思,但是这是正常的,慢慢来嘛。

**************************************************************************************************************

(图5:第12个函数)

**************************************************************************************************************

最后看第13个函数,int rempwr2(int x, int n),要求我们计算x%(2^n),其中0<=n<=30。该怎么做呢?我们来看,如果x=0x12345678,n=16,那么x%(2^n)的结果即为0x5678;如果x=0x12345678,n=8,那么x%(2^n)的结果即为0x78;如果x=0x12345678,n=24,那么x%(2^n)的结果即为0x345678。看到这儿,相信大家已经有了思路,即首先针对不同的n,计算出相应的掩码(你不需要知道掩码具体是干嘛的,你只需要知道它是用来获取特定比特位的就行了,大二上计算机网络会详细讲到),可以写作"int mask=~((0x1<<31)>>(32+~n+1));",接着"return x&mask"即可,但是注意!!!这仅适用于x为正数的情况,如果x为负数,比如x=0x80000001,n=8,那么x%(2^n)的结果不应该为0x01,而应该是0xFFFFFF01;比如x=0x80000002,n=8,那么x%(2^n)的结果不应该为0x02,而应该是0xFFFFFF02;比如x=0xFFFFFFFF,n=8,那么x%(2^n)的结果不应该为0xFF,而应该是0xFFFFFFFF,即需要在x&mask的基础上,在填充相应的几个F,即"(x&mask)&((0x1<<31)>>31)"(说实话我们的这个方法很蹩脚,很不推荐使用)。另外如果n=0,则应该返回0,如(图7:第13个函数)所示。(对不起大家哈,中间省略了很多很多的调试步骤,没有展示出来)

**************************************************************************************************************

(图7:第13个函数)

**************************************************************************************************************

最后,这5个函数的C语言源代码如(图8:第9,10,11,12,13个函数的C语言源代码)所示。同时再一次告诉大家,不要被做得快的人搞崩了心态,一步一步慢慢来,基础打好了,未来什么都不怕。加油!

 **************************************************************************************************************

int isLess(int x, int y) {
  int ret1=~(x>>31)+1;
  int ret2=((x+~y+1)>>31)&0x1;
  int con=!((x>>31)^(y>>31));
  return (con&ret2)|(!con&ret1);
}
int isLessOrEqual(int x, int y) {
  int ret1=~(x>>31)+1;
  int ret2=((x+~y+1)>>31)&0x1;
  int con=!((x>>31)^(y>>31));
  return (con&(ret2|!(x^y)))|(!con&ret1);
}
int trueFiveEighths(int x)
{
  int pos=!(x>>31);
  int neg=1+~(x>>31);
  int end57df=!((x&0x5)^0x5);
  int end08=!(x&0x7);
  int endother=(!end57df)&(!end08);
  int ret = (x>>1)+(x>>3)+(1&((pos&end57df)|(neg&endother)))+((neg&end57df)<<1);
  return ret;
}
int parityCheck(int x) {
  x=(x>>16)^x;
  x=(x>>8)^x;
  x=(x>>4)^x;
  x=(x>>2)^x;
  x=(x>>1)^x;
  return (x&0x1);
}
int rempwr2(int x, int n) {
  int intmin=0x1<<31;
  int orimask=(intmin>>(31+~n+1));
  int mask=~orimask;
  int neg=x>>31;
  int pos=~neg;
  int posret = x&mask;
  int negret = (((!!posret)<<31)>>31)&(posret|orimask);
  return (pos&posret)|(neg&negret);
}

(图8:第9,10,11,12,13个函数的C语言源代码)

**************************************************************************************************************

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

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

相关文章

nacos配置变更导致logback日志异常

问题背景: 线上的服务突然内存爆满&#xff0c;查服务器突然发现&#xff0c;日志全部打印到了/tmp/tomcat.xxx.port目录下&#xff0c;后来对应操作时间&#xff0c;和nacos修改配置是同一时间发生的&#xff0c;但是疑惑的点是&#xff0c;nacos配置变更为什么会引起logback的…

MySQL与其他数据库产品的比较,优势在哪里?

作为数据库管理领域的博主作家&#xff0c;我深知数据库在软件开发和数据管理中的重要性。在当今众多的数据库产品中&#xff0c;MySQL作为一种流行的开源关系型数据库管理系统&#xff0c;具有许多优势和特点。下面&#xff0c;我将通过对与其他数据库产品的比较以及MySQL的优…

【华为数通HCIP | 网络工程师】821刷题日记-IS-IS(2)

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

mac截图Snagit 中文介绍

1.超越普通的屏幕截图 TechSmith Snagit 是唯一具有内置高级图像编辑和屏幕录制功能的屏幕捕获软件。因此&#xff0c;您可以在一个程序中轻松创建高质量的图像和视频。 2.最后&#xff0c;屏幕捕获软件可以完成您所做的一切 快速解释一个过程如果您正在努力清楚地沟通&…

电子学会C/C++编程等级考试2022年12月(三级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:鸡兔同笼 一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物,至多有多少只动物。 时间限制:1000 内存限制:65536输入 一行,一个正整数a (a < 327…

HarmonyOS——UI开展前的阶段总结

当足够的了解了HarmonyOS的相关特性之后&#xff0c;再去介入UI&#xff0c;你会发现无比的轻松&#xff0c;特别当你有着其他的声明式UI开发的经验时&#xff0c;对于HarmonyOS的UI&#xff0c;大致一扫&#xff0c;也就会了。 如何把UI阐述的简单易懂&#xff0c;又能方便大…

全局异常处理类

全局异常处理类 创建步骤 定义一个自己的全局错误处理类GlobalExceptionHandler创建一个ExceptionHandler类&#xff0c;主要是用ControllerAdvice和 ExceptionHandler处理错误信息 以下说明各个注解的作用&#xff1a; ControllerAdvice(annotations {RestController.class…

【C++】单链表——单链表的基本操作

1、单链表的定义 由于顺序表的插入删除操作需要移动大量的元素&#xff0c;影响了运行效率&#xff0c;因此引入了线性表的链式存储——单链表。单链表通过一组任意的存储单元来存储线性表中的数据元素&#xff0c;不需要使用地址连续的存储单元&#xff0c;因此它不要求在逻辑…

Mysq8l在Centos上安装后忘记root密码如何重新设置

场景 Mysql8在Windows上离线安装时忘记root密码&#xff1a; Mysql8在Windows上离线安装时忘记root密码-CSDN博客 如果是在Windows上忘记密码可以参考上面。 如果在Centos中安装mysql可以参考下面。 CentOS7中安装Mysql8并配置远程连接和修改密码等&#xff1a; CentOS7中…

【知识】稀疏矩阵是否比密集矩阵更高效?

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 问题提出 有些地方说&#xff0c;稀疏图比密集图的计算效率更高&#xff0c;真的吗&#xff1f; 原因猜想 这里的效率高&#xff0c;应该是有前提的&#xff1a;当使用稀疏矩阵的存储格式(如CSR)时&#xff0c;计…

使用 Docker 安装和配置 MySQL 数据库简介

目录 一、使用镜像安装 1、查询镜像 2、拉取镜像 3、查看本地镜像 4、启动docker镜像 二、使用Docker Compose安装 1、安装Docker和Docker Compose 2、创建Docker Compose文件&#xff1a; 3、启动MySQL容器 4、验证MySQL容器是否正常运行 5、连接到MySQL容器 6、停止…

适用于 Windows 的最佳电脑数据恢复软件是什么?

数据丢失是数字世界中令人不快的一部分&#xff0c;它会在某一时刻影响许多计算机用户。很容易意外删除一些重要文件&#xff0c;这可能会在您努力恢复它们时带来不必要的压力。幸运的是&#xff0c;数据恢复软件可以帮助恢复已删除的文件&#xff0c;即使您没有备份它们。这是…

【IEEE独立出版】2024第四届神经网络、信息与通信工程国际学术会议(NNICE 2024)

2024第四届神经网络、信息与通信工程国际学术会议&#xff08;NNICE 2024&#xff09; 2024 4th International Conference on Neural Networks, Information and Communication Engineering 2024第四神经网络、信息与通信工程国际学术会议&#xff08;NNICE 2024&#xff0…

Halcon Solution Guide I basics(5): 1D Measuring(一维测距)

文章专栏 我的Halcon开发 CSDN 专栏 Halcon学习 练习项目gitee仓库 CSDN Major 博主Halcon文章推荐 随笔分类 - Halcon入门学习教程 前言 今天来学直线测距&#xff0c;主要是用来测量连点之间的线段距离。感觉是用来得到工业产品精度的。 文章解读 一维测距是非常简单的这里…

稳定的音频来了 — 使用人工智能创作音乐(for free)

今天&#xff0c;以稳定扩散&#xff08;Stable Diffusion&#xff09;和StableLM等开源AI工具和模型而闻名的Stability AI公司推出了其首个音乐和声音生成AI产品——StableAudio。音乐产业以其难以打入而闻名。即使您拥有才华和动力&#xff0c;您仍然需要创作和制作音乐所需的…

LaTeX插入裁剪后的pdf图像

画图 VSCode Draw.io Integration插件 有数学公式的打开下面的选项&#xff1a; 导出 File -> Export -> .svg导出成svg格式的文件。然后用浏览器打开svg文件后CtrlP选择另存为PDF&#xff0c;将图片存成pdf格式。 裁剪 只要安装了TeXLive&#xff0c;就只需要在图…

wvp如果确认音频udp端口开放成功

用到工具 在服务器上开启端口监听 选中udp server&#xff0c;点击创建按钮 设置服务器监听端口 在客户端连接服务器端口 选中udp客户端&#xff0c;点击创建 输入服务器地址 远程端口和本地端口&#xff0c;本地端口只要没被占用都可以使用 &#xff0c;点击确认 发送数据 …

福州大学《嵌入式系统综合设计》 实验九:ROI视频编码

一、实验目的 ROI视频编码即感兴趣区域视频编码&#xff0c;即针对感兴趣区域进行重点编码&#xff0c;提高编码质量&#xff0c;而对非感兴趣区域采用低质量编码。通过这种方法可以降低码率。本实验即让同学们能够在算能的FFMPEG接口下实现基于ROI的视频编码。 二、实验内容…

燃料电池汽车市场分析:预计2028年将达到118亿美元

燃料电池汽车( FCV) 是一种用车载燃料电池装置产生的电力作为动力的汽车。车载燃料电池装置所使用的燃料为高纯度氢气或含氢燃料经重整所得到的高含氢重整气。与通常的电动汽车比较, 其动力方面的不同在于FCV 用的电力来自车载燃料电池装置, 电动汽车所用的电力来自由电网充电的…

C++ AVL 树

AVL树的概念 当数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;此时二叉搜索树的搜索效率低下 解决方法&#xff1a;AVL树&#xff08;降低树的高度&#xff0c;从而减少平均搜索长度) 一棵AVL树或者是空树&#xff0c;或者是具有以下性质的二叉搜索树&#xff1…