探秘计算机内部的魔法:模拟计算机内部的怎么使用门电路实现运算的奥秘

1.前言 

在当今数字时代,我们享受着计算机带来的便利和效率,但很少有人意识到在计算机背后的神秘世界。计算机内部运算的奥秘并非仅仅是一系列简单的加减乘除,而是依托着深奥的门电路与位运算符展开的神秘舞蹈。在这篇博客中,我们将探秘计算机内部的魔法,深入剖析如何利用门电路模拟加减乘除等基本运算,揭示计算机运算背后隐藏的真相与奥秘。随我一起踏入这个神秘的世界,探寻计算机运算背后的魔法秘籍!

在计算机内部,运算并非简单地使用运算符,而是通过门电路实现的位运算符来完成。在这篇文章中,我们将深入探讨计算机底层如何模拟使用位运算实现加法,揭示其中的奥秘。

2. 加法

    public static int add(int a, int b) {while (b != 0) {// 计算进位int carry = (a & b) << 1;// 异或操作得到不考虑进位的和a = a ^ b;// 将进位赋值给b,继续循环直到进位为0b = carry;}return a;}

 2. 减法

和减法原理相似就是使用,5 - 3 = 5 + (-3的补码)

  public static int subtract(int a, int b){b = (~b + 1);//转换为负数的补码return add(a,b);}

 3.乘法

乘法我的思想: 20 * 7 = 20 * (2º + 2¹ + 2²) = 20 << 0 + 20 << 1 + 20 << 2 

这是同为正数的情况下,正所谓 正正得正,负正 正负得负,负负得正,所以我就可以使用异或来实现判断同为1,异为0,然后我进行绝对值相乘即可。

  public static int multiply(int a, int b){int sign = (a >> 31) ^ (b >> 31); // 确定符号位a = abs(a); // 取a的绝对值b = abs(b); // 取b的绝对值int result = 0;while (b != 0) {if ((b & 1) != 0) { // 如果 b 的最低位为1result = add(result, a); // 累加到结果中}a <<= 1; // 左移相当于乘以2b >>= 1; // 右移相当于除以2}return sign == 0? result : ~result + 1;}public static int abs(int x) {int mask = x >> 31; // 获取符号return mask == 0 ? x : ~(subtract(x,1)); // 正数不变,负数取反加一}

 4.除数

    public static int divide(int a, int b) {// 确定符号位int sign = (a >> 31) ^ (b >> 31);// 取绝对值a = abs(a);b = abs(b);// 处理被除数为0的情况if (b == 0) {throw new ArithmeticException("被除数不能为0");}int result = 0;for (int i = 30; i >= 0 ; i = subtract(i,1)) {if((a >> i) >= b) {//判断是否可商result |= (1 << i);//i位置变为1a = subtract(a,b << i);//余数赋值给a}}return sign == 0 ? result : ~result + 1;}

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

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

相关文章

mfc 带有复选框的ListBox

mfc 带有复选框的 ListBox 效果&#xff1a; 添加 ListBox 控件 从工具箱拖拽 ListBox 控件到窗口上&#xff0c;并设置属性&#xff1a; 包含字符串&#xff1a;true所有者描述&#xff1a;Fixed 给ListBox添加控制变量 添加完后&#xff0c;将m_list_box的类型使用CC…

Aurora 协议学习理解与应用——Aurora 8B10B协议学习

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Aurora 8B10B协议学习之一&#xff0c;理解协议 概述8B10B数据发送和接收Symbol-Pairs传输调度用户PDU传输过程用户PDU接收过程 流控自然流量控制操作自然流量控制延迟自然流…

ECharts数据大屏展示效果

ECharts数据大屏展示效果 前言1、效果预览1.2、视频效果 2、使用框架3、如何处理屏幕自适应效果4、ECharts模块、dataV大屏插件 编写与布局5、往期回顾总结&#xff1a; 前言 数据大屏需整体效果好看&#xff0c;界面缩放自适应大小&#xff0c;全屏展示铺满整个屏幕并自适应&a…

海外云手机为什么适合社媒运营?

如今&#xff0c;社媒营销如果做得好&#xff0c;引流效果好的账号&#xff0c;可以用来带货变现&#xff0c;而外贸、品牌出海也同样都在做社媒营销&#xff0c;Tik Tok、facebook、ins等热门的海外社媒平台都是行业密切关注的&#xff0c;必要的时候&#xff0c;大家会使用海…

22 文件系统

了解了被打开的文件&#xff0c;肯定还有没被打开的文件&#xff0c;就是磁盘上的文件。先从磁盘开始认识 磁盘 概念 内存是掉电易失存储介质&#xff0c;磁盘是永久性存储介质 磁盘的种类有SSD&#xff0c;U盘&#xff0c;flash卡&#xff0c;光盘&#xff0c;磁带。磁盘是…

自制多端同步云笔记 InfiniCloud + RemotelySave + foldersync

InfiniCloud Obsidian 第三方插件 RemotelySave foldersync实现多端同步云笔记【2024-04-16】 一、使用工具二、搭建步骤2.1、注册 InfiniCloud 网盘2.2、搭建PC端与网盘的通信2.2.1、打开 InfiniCloud 中WebDAV配置2.2.2、obsidian中下载 remoted save 第三方插件【需要科学…

loD:如何实现代码的“高内聚、低耦合“

设计模式专栏&#xff1a;http://t.csdnimg.cn/3a25S 目录 1.引用 2.何为"高内聚、低耦合" 3.LoD 的定义描述 4.定义解读与代码示例一 5.定义解读与代码示例二 1.引用 本节介绍最后一个设计原则:LoD(Law of Demeter&#xff0c;迪米特法则)。尽LoD不像SOLID、KI…

ncnn模型部署——训练自己YOLOv5模型转ncnn模型并部署到Android手机端

目录 一、前述二、源码包准备2.1 配套源码包2.2 官网源码包2.2.1 ncnn版YOLOv5源码包下载2.2.2 ncnn预编译库下载2.2.3 拷贝ncnn预编译库 三、可能遇到问题3.1 gradle下载失败3.2 CMake问题3.2.1 报错3.2.2 问题分析3.2.3 解决办法3.2.4 添加环境变量3.2.5 测试CMake 3.3 Unabl…

27. 【Android教程】下拉选择框 Spinner

本节我们将学习 Android 提供的下拉选择框——Spinner&#xff0c;它也是 Adapter 的常客。不仅仅是在 Android 端&#xff0c;在 Windows 上我们也经常会看到 Spinner 类型的样式。通常它是以下拉的形式存在&#xff0c;Spinner 在下拉列表中包含很多可供用户选择的选项&#…

Docker+Uwsgi部署Django项目

在之前的文章中&#xff0c;已经给大家分享了在docker中使用django自带的命令部署项目&#xff0c;这篇文章主要讲解如何使用uwsgi部署。 1. 在Django项目的根目录下新建Dockerfile文件 #Dockerfile文件 # 使用 Python 3.9 作为基础镜像 FROM python:3.9# 设置工作目录 WORKDI…

Intel显卡驱动导致Qt opengl 渲染YUV时拉伸窗口内存泄漏

最近在使用QOpenGLWidget做YUV视频渲染&#xff0c;发现在拉伸窗口的时候内存暴涨&#xff0c;如果窗口不动则内存不变。 可以得出结论一定是resizeGL出了问题&#xff0c;但是其实这里代码很简单 glViewport(0, 0, w, h); 还有就是变换矩阵计算&#xff0c;根本没资源建立与释…