西工大网络空间安全学院计算机系统基础实验一(14,15)

news2024/11/16 7:29:11

给大家强调一点,如果这门课你只是通过了,但是其实你并不懂其中的原理,千万不要害怕,不要胆怯,因为后面你还有很多很多的时间来回头巩固它,正所谓“君子报仇,十年不晚”。同样的道理,面临期末考试的时候,需要复习的知识点很多,需要做的题很多,自己记了很多知识点又不会用,很焦虑很着急,而我想说的是,没必要感到焦虑,针对你认为有价值的科目,一步一步慢慢来,把基础打好,后面都不是问题。我个人的做法一直都是,稳扎稳打把基础打好,即使到了最后还有很多内容没有复习到,但是只要考试时,把会写的写上去,不会写的把自己记得的定义一股脑默写上去,实在不行把题目抄一遍,能通过就可以。毕竟来日方长,后面还有时间可以补。最重要的事情是,千万不要熬夜,更不要通宵!!!睡一觉醒来,问题都能过去的。

我们来看第14个函数,int howManyBits(int x),为了用二进制补码形式表示x,最少需要多少位。比如为了表示12,1100B,引入符号位作为最高位,一共需要5位,即howManyBits(12) = 5; 为了表示298,1 0010 1010B,引入符号位作为最高位,一共需要10位,即howManyBits(298) = 10;为了表示-5,1...1011B,截取从左到右连续的的最后一个1及其后续比特,得到1011B,一共需要4位,即howManyBits(-5) = 4;为了表示0,0B,虽然似乎也需要引入符号位最为最高位,但事实上,可以只用0B,就可以表示1(现在不要深究这一点);为了表示-1,1...1111B,截取从左到右连续的的最后一个1及其后续比特,得到1B,一共需要1位,即howManyBits(-1) = 1;为了表示0x80000000,截取从左到右连续的的最后一个1及其后续比特,得到0x80000000,一共需要32位,即howManyBits(0x80000000) = 32。在这里,我们隐隐约约就感觉到,对于任意x,只需截取从左到右连续的与第一个比特位相同的最后一个比特及其后续比特,并统计截取到的比特长度就可以,换言之,对于正数x,因为第一个比特位为0,故只需截取从左到右连续的的最后一个0及其后续比特,并统计截取的比特长度;对于负数x,因为第一个比特位为1,故只需截取从左到右连续的的最后一个1及其后续比特,并统计截取的比特长度。下面我们针对x是正或负的两种不同情况,展开分别讨论:第一种情况,x是正,则可以通过如(图1:第14个函数——针对x为正时的思路)中所示的代码得到掩码,进而掩码的比特位数加上1(额外的一个符号位),即为最终需要返回的结果。那么我们该如何统计掩码的比特位数呢?借鉴我们已经写出来的bitCount函数,如(图2:第14个函数——借鉴已经写出来的bitCount函数)所示,得到了如(图3:第14个函数——针对x为正时,统计需要用二进制补码形式表示所需的最小比特长度)所示的代码。

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

(图1:第14个函数——针对x为正时的思路)

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

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

(图2:第14个函数——借鉴已经写出来的bitCount函数)

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

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

(图3:第14个函数——针对x为正时,统计需要用二进制补码形式表示所需的最小比特长度)

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

针对第二种情况,如果x为负,那么该怎么办呢?很简单,对其各位取反就可以, 比如0xFFFFFFFF,各位取反得到了0x0,将0x0经过如图1所示的取掩码操作,得到了0x0,接着经过图2中统计字节中1的个数的做法,(如果搞明白了bitCount函数所使用的汉明重量这个知识点,使用的操作符的数量还可以更少,但是考虑到时间紧迫,不得不放弃优化)得到了0,最后根据图3,返回值再加1,得到了1,正好是我们想要的结果howManyBits(-1) = 1;再比如0xFFFF8123,各位取反得到了0x00007EDC,取掩码得到了0x7FFF,统计1的个数为15,最后加1为16,正好是我们期望的结果。那么该如何表示这个条件判断呢?(int sign=x>>31; if(sign) {x=~x} else x)我们可以写作:x=(sign&(~x))|((~sign)&x);。最终,我们仿照前13个函数的检验过程,如(图4:第14个函数)所示。

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

(图4:第14个函数)

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

最后,看第15个函数,int ilog2(int x),计算log2(x)。按照容易理解的方式,先写出来几个例子:当x=16时,0x10,发现从左到右第一个1的位置是从右到左第5个比特;当x=13时,0xD,发现从左到右第一个1的位置是从右到左第5个比特;当x=255时,0xFF,发现从左到右第一个1的位置是从右到左第8个比特。所以我们的思路便是,得到x的掩码(这个表述不太对,但大概意思是,对于16,得到0x1F,对于13,得到0xF,对于254,得到0xFF),这可以通过图1中的代码实现。接着统计x的掩码中比特位为1的个数,这可以通过之前写过的bitCount函数实现,最终得到的结果减去1,即为我们期望中的答案。我们的代码如(图5:第15个函数——代码)所示。最后仿照前14个函数的检验方法,验证我们的答案是否正确,如(图6:第15个函数)所示。

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

(图5:第15个函数——代码)

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

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

(图6:第15个函数) 

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

最后,这两个函数的源代码如(图7:第14、15个函数的源代码)所示。

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

int howManyBits(int x) {
  int temp1; int temp2; int temp3; int n; int count;
  int sign=x>>31;
  x=(sign&(~x))|((~sign)&x);
  x|=x>>1;
  x|=x>>2;
  x|=x>>4;
  x|=x>>8;
  x|=x>>16;
  temp1=0x55|(0x55<<8)|(0x55<<16)|(0x55<<24);
  temp2=0x33|(0x33<<8)|(0x33<<16)|(0x33<<24);
  temp3=0xf|(0xf<<8)|(0xf<<16)|(0xf<<24);
  n=x+~((x>>1)&temp1)+1;
  n=(n&temp2)+((n>>2)&temp2);
  n=(n+(n>>4))&temp3;
  n=n+(n>>8);
  n=n+(n>>16);
  count=(n&0x3f)+1;
  return count;
}
int ilog2(int x) {
  int temp1; int temp2; int temp3; int n; int count;
  x|=x>>1;
  x|=x>>2;
  x|=x>>4;
  x|=x>>8;
  x|=x>>16;
  temp1=0x55|(0x55<<8)|(0x55<<16)|(0x55<<24);
  temp2=0x33|(0x33<<8)|(0x33<<16)|(0x33<<24);
  temp3=0xf|(0xf<<8)|(0xf<<16)|(0xf<<24);
  n=x+~((x>>1)&temp1)+1;
  n=(n&temp2)+((n>>2)&temp2);
  n=(n+(n>>4))&temp3;
  n=n+(n>>8);
  n=n+(n>>16);
  count=(n&0x3f)+(~1)+1;
  return count;
}

(图7:第14、15个函数的源代码)

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

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

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

相关文章

OSI七层参考模型及其协议和各层设备

OSI网络模型是开放系统互联&#xff08;Open Systems Interconnection&#xff09;参考模型&#xff0c;它是由国际标准化组织&#xff08;ISO&#xff09;制定的。这个模型将网络系统划分为七个层次&#xff0c;OSI网络模型的七层是&#xff1a;物理层、数据链路层、网络层、传…

牛客算法题 HJ99 自守数 golang实现

题目 HJ99 自守数 描述 自守数是指一个数的平方的尾数等于该数自身的自然数。例如&#xff1a;25^2 625&#xff0c;76^2 5776&#xff0c;9376^2 87909376。请求出n(包括n)以内的自守数的个数数据范围&#xff1a; 1 ≤ &#xfffd; ≤ 100001≤n≤10000 输入描述&…

ACM32F070 RTC 引脚做普通 GPIO 用法配置

有场景需要把带RTC引脚功能的IO当做普通的GPIO使用&#xff0c;但是按照正常的GPIO初始化却无法使用&#xff0c;该芯片手册中有给出介绍 现给出配置方法&#xff0c;参考官方SDK里面PC13的配置&#xff1a; // PC13 GPIOC_Handle.Pin GPIO_PIN_13; GPIOC_Handle.Mod…

数据可视化:用图表和图形展示数据

写在开头 在当今信息爆炸的时代,海量的数据如同一座沉默的宝库,等待着我们挖掘和理解。然而,这些庞大的数据集本身可能令人望而生畏。在这个时候,数据可视化成为了解数据、发现模式和传达信息的强大工具。本篇博客将带领你探索数据可视化的奇妙世界,学习如何在python中使…

MacBook macOs安装RabbitMQ【超详细图解】

目录 一、使用brew安装RabbitMQ 二、安装RabbitMQWeb管理界面 三、启动RabbitMQ 一、使用brew安装RabbitMQ 刚好项目要用到RabbitMQ&#xff0c;安装顺便写下安装步骤记录一下以备用 使用brew命令安装&#xff0c;一般Mac会自带这个命令&#xff0c;如没有&#xff0c;…

如何看网络架构图-1基础篇

这是一个比较常见的网络部署架构图&#xff0c;通过LVSKeepalive做网络层的高可用架构&#xff0c;在应用层通过nginx做应用层细粒度的请求管控&#xff0c;然后根据负载均衡策略将请求转发到后端的tomcat服务。 首先看到这样的图&#xff0c;相信大部分人都能看懂&#xff0c;…

【Hydro】SG滤波器纯numpy实现

目录 说明WIKI示例滑动平均卷积系数的推导第一点和最后点的处理scipy.signal中的savgol_filter纯numpy实现的savgol_filterCPP实现的savgol_filter参考文献说明 Savitzky-Golay滤波器(S-G滤波器)是一种在时域和频域上同时进行的滤波方法,它通过局部多项式拟合来平滑信号。这…

python中,or、not的用法

or的用法 在python中,or运算符是一个逻辑运算符&#xff0c;用于在多个条件中选择至少一个为真&#xff08;True&#xff09;的情况。 如果条件中的任意一个为真&#xff0c;整个表达式的结果就为真 如&#xff1a; 示例1: 检查两个数字中至少有一个正数 示例2: x True y …

分发测试应用平台怎么用之应用详情功能

我的应用 应用功能引导 ●您会看到以下页面&#xff0c;下图为功能的解释方便您的运行 我的应用-详情-应用详情 ●我们点击应用详情数字③&#xff0c;点击应用详情&#xff0c;下图是对详情页的功能介绍。 详情-应用设置 ●详情-应用设置-下图为应用设置的上半部分 ●下图为应…

从零构建属于自己的GPT系列1:文本数据预处理、文本数据tokenizer、逐行代码解读

&#x1f6a9;&#x1f6a9;&#x1f6a9;Hugging Face 实战系列 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在PyCharm中进行 本篇文章配套的代码资源已经上传 从零构建属于自己的GPT系列1&#xff1a;文本数据预处理 从零构建属于自己的GPT系列2&#xff1a;语…

聚焦清晰度评价指标所用到的各种算法

首先&#xff0c;我想吐槽一下&#xff0c;看了好几篇聚焦评价函数的文章&#xff0c;说到底都是一篇文章转载或者重复上传&#xff0c;介绍了将近 15 种清晰度的算法&#xff0c;原文找了半天都没找到在哪&#xff0c;最多也仅能找到一些比较早的转载。 无参考图像的清晰度评…

众新万能空调遥控器代码

众新万能空调遥控器代码 特此记录 anlog 2023年11月30日

JPA代码生成器

【Java代码生成神器】自动化生成Java实体类、代码、增删改查功能&#xff01;点击访问 推荐一个自己每天都在用的Java代码生成器&#xff01;这个网站支持在线生成Java代码&#xff0c;包含完整的Controller\Service\Entity\Dao代码&#xff0c;完整的增删改查功能&#xff01…

Linux | Ubuntu设置 netstat(网络状态)

netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据&#xff0c;一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序&#xff0c;它能提供TCP连接&#xff0c;TCP和UDP监听&#xff0c;进程内存管理的相关报告。 1.netstat的安装 搜…

自己的邮箱名称出现在别人的此电脑的网络位置中

在公司别的同事告诉我&#xff0c;我的邮箱名字出现在他们的【此电脑】-【网络位置中】 如图&#xff1a; 当时吓我一跳&#xff0c;因为我总喜欢搞一些渗透的东西&#xff0c;我以为把自己暴漏了&#xff0c;然后疯狂的在网上找原因。 于是就搜到一位安暖的博主&#xff1a; …

VSCode搭建STM32开发环境

1、下载安装文件 链接&#xff1a;https://pan.baidu.com/s/1WnpDTgYBobiZaXh80pn5FQ 2、安装VSCodeUserSetup-x64-1.78.2.exe软件 3、 在VSCode中安装必要的插件 3、配置Keil Assistant插件 4、在环境变量中部署mingw64编译环境

电商API接口对于实现电商系统平台的搭建有哪些作用?

电商API接口用于实现电商平台的数据交互和功能调用。具体来说&#xff0c;电商API接口可以用于以下几个方面&#xff1a; 1. 商品管理&#xff1a;通过API接口&#xff0c;可以实现商品的添加、修改、删除、查询等操作。商家可以通过API接口将自己的商品信息上传到电商平台&…

C++基础 -22- 菱形继承

理想的菱形继承如图所示 #include "iostream"using namespace std;class top {public:void baseshow(){cout << "baseshow" << endl;} };class left:public::top {public:void leftshow(){cout << "leftshow" << end…

图论|并查集理论基础 1971. 寻找图中是否存在路径

什么是并查集 并查集是一种数据结构&#xff0c;用于处理一些不交集的合并及查询问题。它支持两种操作&#xff1a; 查找&#xff08;Find&#xff09;&#xff1a;确定某个元素属于哪个子集。它可以用来判断两个元素是否属于同一个子集。 合并&#xff08;Union&#xff09;&…

YOLOv8独家原创改进:自研独家创新FT_Conv,卷积高效结合分数阶变换

💡💡💡本文自研创新改进:卷积如何有效地和频域结合,引入分数阶傅里叶变换(FrFT)和分数阶Gabor变换(FrGT),最终创新到YOLOv8。 使用方法:1)直接替换原来的C2f;2)放在backbone SPPF后使用;等 推荐指数:五星 在道路缺陷检测任务中,原始map为0.8,FT_Conv为0.82 收…