逻辑运算加法器

前言

逻辑门本质上操作的是单个二进制数,通过高低电压或者有无信号来表示,并且,因为二进制数的原因,一个数字,我们可以通过二进制数来表示,整数可以精确表示,浮点数可以近似表示
本篇文章使用逻辑门来构建加法器
git地址:https://gitlab.com/lingyanTools/comvirtual.git

加法器

先来看整数,一个二进制整数是怎么进行加法运算的呢?
看下面两个二进制数
A = 101 (十进制) = 01100101 (二进制) A = 101(十进制) = 01100101(二进制) A=101(十进制)=01100101(二进制)
B = 201 (十进制) = 11001001 (二进制) B = 201(十进制) = 11001001(二进制) B=201(十进制)=11001001(二进制)
我们从右边开始往左侧进行计算,计算相应的位,如果大于1,则进位,整个流程如下:

  1. 默认进位是0
  2. 1 + 1 + 进位0 = 0,进位1
  3. 0 + 0 + 进位1 = 1,进位0
  4. 1 + 0 + 进位0 = 1,进位0
  5. 0 + 1 + 进位0 = 1,进位0
  6. 0 + 0 + 进位0 = 0,进位0
  7. 1 + 0 + 进位0 = 1,进位0
  8. 1 + 1 + 进位0 = 0,进位1
  9. 0 + 1 + 进位1 = 0,进位1

因为最后有个进位,所以最终的结果位100101110 = 302 = 101 + 201
很容易发现,对于二进制的加法的每一位操作,有两个值需要我们确定,一个是当前的进位值 C i C_i Ci,一个是当前的计算值 F i F_i Fi,可以用下面的公式表示:
{ F i = ( X i 异或 Y i ) 异或 C i − 1 , C i = ( X i 与 C i − 1 ) 或 ( Y i 与 C i − 1 ) 或 ( X i 与 Y i ) \begin{cases} F_i = (X_i 异或 Y_i) 异或 C_{i-1},\\ C_i = (X_i 与 C_{i-1}) 或 (Y_i 与 C_{i-1}) 或 (X_i 与 Y_i ) \end{cases} {Fi=(Xi异或Yi)异或Ci1,Ci=(XiCi1)(YiCi1)(XiYi)

用电路表示 F i F_i Fi的值为:
在这里插入图片描述

用电路表示 C i C_i Ci的值为:
在这里插入图片描述

我们把通过输入 X i X_i Xi Y i Y_i Yi C i − 1 C_{i-1} Ci1获取输出$F_i 和 和 C_i$用C语言表示如下:

/*** 全加器* 输入两个二进制位,其实就是两根电路* 输入进位位:c* param:* f:输出值* c1:输出进位值* 返回加法位*/
void full_add(long x,long y,long c,long* f, long* c1)
{long a = xor_gate(x, y);*f = xor_gate(a, c);long b1 = and_gate(x, c);long b2 = and_gate(y, c);long b3 = and_gate(x, y);*c1 = or_gate(or_gate(b1, b2),b3);
}

这个电路组合叫做全加器

串位进位加法器

上述的全加器可以计算一位的加法,我们把每位的运算连起来,就是我们上面计算过程列出的那样,从右向左依次计算,假设我们需要满足一个64位的加法器,我们可以用64个全加器串行连接起来,下图中n=64:
在这里插入图片描述

这种连接方式叫做串位进位加法器
这样我们的64位加法器就可以用C语言描述了

/*** 逻辑运算器的加法* param:* in_1:输入1* in_2:输入2* bits:选择执行加法的位数* 初始进位,并且返回执行后的进位* return: 返回输出结果*/
long alu_add(long in_1, long in_2, long bits,long* c)
{long result = 0;for(int i = 0;i<bits;i++){long x = alu_bit(in_1, i); // 获取输入1的第i位long y = alu_bit(in_2, i); // 获取输入2的第i位long f = 0;full_add(x, y, *c, &f, c);result |= f<<i;}return result;
}/*** 获取二进制位* param:* in_1:输入的数据* bits:获取哪一位的二进制位,0~sizeof(long)-1* return* 返回获取到的数据0或1*/
unsigned long alu_bit(unsigned long in_1, long bits)
{unsigned long a = 1;return ((a<<bits)&in_1)>>bits;
}

进位选择加法器

串位进位加法器由于是串行的,这就导致每一步的运算必须等待前面一位计算完成。几乎所有的算术运算都要用到ALU, ALU的核心还是加法器,因此要提高运算速度, 加法器的速度非常关键。
在进行进位选择加法器讲解之前,先介绍一种选择器,2-1选择器

2-1选择器

2-1选择器是根据一位控制位控制2个输入输出哪一个的电路选择器,电路图如下:
在这里插入图片描述

我们可以用C语言实现一下

long select_2_1(long in_1,long in_2,long door)
{long a1 =  and_gate(in_1, door);long a2 =  and_gate(in_2, not_gate(door));return or_gate(a1, a2);
}

并且该C函数可以不止实现单个位的选择,对于64位以内的可以通过该方法返回选择后的值。

进位选择加法器

进位选择加法器是这样一种算法,比如对于64位的加法,分成四部分

  • A:0~15位
  • B:16~31位
  • C:32~47位
  • D:48~63位

BCD部分都有两种计算逻辑,一种假设进位为0,一种假设进位为1
所以,A,B0,B1,C0,C1,D0,D1可以并行运算。运算完成后进行拼接,拼接逻辑如下:

  • 根据A的进位选择B0或者B1
  • 根据上一步选择的B0或者B1是否发生进位选择C0或者C1
  • 根据上一步选择的C0或者C1是否发生进位选择D0或者D1

下面看一下C语言的实现

long alu_add_16(long in_1, long in_2)
{long ac = 0;long bc0 = 0;long bc1 = 1;long cc0 = 0;long cc1 = 1;long dc0 = 0;long dc1 = 1;// 下面这些并行运算long a = alu_add(in_1, in_2, 16,&ac);long b0 = alu_add(in_1>>16, in_2>>16, 16,&bc0);long b1 = alu_add(in_1>>16, in_2>>16, 16,&bc1);long c0 = alu_add(in_1>>32, in_2>>32, 16,&cc0);long c1 = alu_add(in_1>>32, in_2>>32, 16,&cc1);long d0 = alu_add(in_1>>48, in_2>>48, 16,&dc0);long d1 = alu_add(in_1>>48, in_2>>48, 16,&dc1);long b = select_2_1(b1, b0, ac);long c = select_2_1(c1, c0, b==b1?bc1:bc0);long d = select_2_1(d1, d0, c==c1?cc1:cc0);return a | b<<16 | c<<32 | d<<48;
}

如何进行减法运算

使用逻辑门进行减法运算,涉及借位,运算比较麻烦,但是我们可以通过操作将减法运算变成加法运算,比如对下面的减法运算:
A = X − Y A = X - Y A=XY
我们可以写成加法的形式:
A = X + ( − Y ) A = X + (-Y) A=X+(Y)

而对于补码编码的数据来说,-Y等于Y取反然后加1,取反操作之需要对Y执行反相器即可,而加1的操作正好可以通过设置加法的初始进位为1来进行处理,下面给出减法运算的C语言电路描述

long alu_not(long in_1, long bits)
{long res = 0;for(int i = 0;i<bits;i++){long x = alu_bit(in_1, i); // 获取输入1的第i位res |= (not_gate(x)<<i);}return res;
}long alu_sub(long in_1, long in_2, long bits)
{long a = alu_not(in_2,64);int c = 1;return alu_add(in_1, a, bits,&c);
}

这样,我们就使用C语言按照电路图的设计实现了加减的逻辑处理。

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

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

相关文章

信息系统定级与等级测评的具体过程

目录 信息系统安全定级流程图 信息系统定级的注意事项 补充内容 信息系统安全等级测评流程图 测评准备阶段 测评机构职责 被测单位职责 方案编制阶段 测评机构职责 被测单位职责 现场测评阶段 测评机构的职责 被测单位职责 分析与报告编制阶段 测评机构职责 被测…

fastadmin点击列表字段复制推广链接

fastadmin点击列表字段复制推广链接 要实现点击复制的功能需要引入外部js分享 利用clipboardjs实现复制功能 下载了之后需要引入外部js 1:把需要的js放在这个路径下 2.去require-frontend.js文件进行配置 3.在使用的js中引入外部js 实际调用

SpringCloudAlibaba Seata在Openfeign跨节点环境出现全局事务Xid失效原因底层探究

原创/朱季谦 曾经在SpringCloudAlibaba的Seata分布式事务搭建过程中&#xff0c;跨节点通过openfeign调用不同服务时&#xff0c;发现全局事务XID在当前节点也就是TM处&#xff0c;是正常能通过RootContext.getXID()获取到分布式全局事务XID的&#xff0c;但在下游节点就出现获…

【数据库系统概论】第3章-关系数据库标准语言SQL(3)

文章目录 3.5 数据更新3.5.1 插入数据3.5.2 修改数据3.5.3 删除数据 3.6 空值的处理3.7 视图3.7.1 建立视图3.7.2 查询视图3.7.3 更新视图3.7.4 视图的作用 3.5 数据更新 3.5.1 插入数据 注意&#xff1a;插入数据时要满足表或者列的约束条件&#xff0c;否则插入失败&#x…

《Nature》预测 2024 科技大事:GPT-5预计明年发布等

《Nature》杂志近日盘点了 2024 年值得关注的科学事件&#xff0c;包括 GPT-5 与新一代 AlphaFold、超算 Jupiter、探索月球任务、生产「超级蚊子」、朝向星辰大海、试验下一代新冠疫苗、照亮暗物质、意识之辩第二回合、应对气候变化。 今年以来&#xff0c;以 ChatGPT 为代表…

CentOS 7 用户必看SQLite 升级指南:轻松将旧版 3.7.17 升级至3.41.2详细教程

0.背景 编写此文是因为在 Linux 上跑项目时报错&#xff1a; sqlite3.NotSupportedError: deterministicTrue requires SQLite 3.8.3 or highe&#xff08;此时已经安装了 python3&#xff09;。sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) near "(&q…

新/旧版本 QT 下载,全攻略【省资源下载币专用】

看到好多朋友找不到指定版本的QT下载路径&#xff0c;特此更新一篇新/旧版本 QT 下载攻略 收藏一下吧&#xff0c;需要的时候方便查找&#xff0c;能为你省下好多资源下载币。 通过图示可以看出&#xff0c;新旧版本的界限并没有那么明晰&#xff0c;如果你需要的版本两个链接…

Podman配置mongodb

文章目录 查询镜像拉取镜像查看镜像运行容器创建root用户 查询镜像 podman search mongo拉取镜像 podman pull docker.io/library/mongo查看镜像 podman images运行容器 podman run -d -p 27017:27017 --namemongodb-test docker.io/library/mongo创建root用户 podman exe…

AI Earth平台简介

AI Earth地球科学云平台由达摩院-视觉技术实验室打造&#xff0c;基于地球科学智能计算分析方面的创新研究&#xff0c;致力于解决地球科学领域基础性、前沿性、业务性问题&#xff0c;目标成为国内一流的地球科学云计算平台。&#xff08;摘自官网&#xff09; 下面&#xff…

网站数据统计基础:PV、UV与IP的解读

在数字时代&#xff0c;了解和分析网站流量至关重要。无论是新手网站所有者还是资深市场分析师&#xff0c;掌握如何解读网站的PV、UV和IP等指标对于评估网站表现、优化用户体验和制定有效市场策略都是必不可少的。以下是对这三个关键指标的详细介绍。 文章目录 1. PV&#xff…

网页乱码问题(edge浏览器)

网页乱码问题&#xff08;edge&#xff09; 文章目录 网页乱码问题&#xff08;edge&#xff09;前言一、网页乱码问题1.是什么&#xff1a;&#xff08;描述&#xff09;2.解决方法&#xff1a;&#xff08;针对edge浏览器&#xff09;&#xff08;1&#xff09;下载charset插…

k8s 组件

k8s: kubernets:8个字母省略&#xff0c;就是k8s. 自动部署&#xff0c;自动扩展和管理容器化的应用程序的一个开源系统。 k8s是负责自动化运维管理多个容器化程序的集群&#xff0c;是一个功能强大的容器编排工具。 以分布式和集群化的方式进行容器管理。 1.20面试版本 …

[PyTorch][chapter 8][李宏毅深度学习][DNN 训练技巧]

前言&#xff1a; DNN 是神经网络的里面基础核心模型之一.这里面结合DNN 介绍一下如何解决 深度学习里面过拟合,欠拟合问题 目录&#xff1a; DNN 训练常见问题 过拟合处理 欠拟合处理 keras 项目 一 DNN 训练常见问题 我们在深度学习网络训练的时候经常会遇到下面…

Oracle初始化参数修改后,是否需要重启才能生效

可以查看 v$parameter或v$parameter2动态性能视图的ISSYS_MODIFIABLE列。此列指示是否可以使用 ALTER SYSTEM 更改参数以及更改何时生效&#xff1a; IMMEDIATE - 无论用于启动实例的参数文件的类型如何&#xff0c;都可以使用 ALTER SYSTEM 更改参数。 更改立即生效。DEFERRE…

易基因2023年度DNA甲基化研究项目文章精选

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 2023年&#xff0c;易基因参与的DNA甲基化研究成果层出不穷&#xff0c;小编选取其中5篇不同方向的论文与您一起来回顾。 01、易基因微量DNA甲基化测序助力中国科学家成功构建胚胎干细胞…

工厂设备维护管理有什么比较好的解决方案?哪家的工单管理系统功能强大?

生产设备对于工厂来说是十分宝贵的资产。一方面&#xff0c;工厂依赖设备进行生产活动&#xff0c;一旦设备故障就会影响产量&#xff1b;另一方面&#xff0c;工厂中的生产设备一般造价都比较高昂&#xff0c;如果出现故障就会增加工厂的生产成本&#xff1b;再一方面&#xf…

Linux部署MeterSphere结合内网穿透实现远程访问服务管理界面

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

makefile教程(1)

makefile教程 makefile是什么&#xff1a; makefile是用户自行完成的IDE&#xff08;integrated development environment集成开发环境&#xff09;程序&#xff0c;与传统的操作系统下的编译不同&#xff0c;makefile可以通过用户自行安排&#xff0c;决定文件的编译顺序&am…

第 377 场周赛虚拟参赛记录及补题

最小数字游戏 3 题目 - 思路 模拟代码 class Solution { public:vector<int> numberGame(vector<int>& nums) {sort(nums.begin(),nums.end());vector<int> ans;for (int i 0;i < nums.size();i ) if (i&1)ans.push_back(nums[i-1]);else ans.…

postman的下载安装和使用

第一章、使用postman向后端发送请求 1.2&#xff09;postman下载与安装使用 我的百度网盘postman点击下载 提取码&#xff1a;bybp 下载后双击.exe文件直接安装 点击此次创建集合 点击此处创建请求 1.2&#xff09;发送get请求 选择自己的请求方式&#xff0c;输入请求…